kotlin springmvc项目运行时报错 "There is already 'XXX' bean method"
一、问题
项目中有一个controller类,有一个searchById方法,其中isLocal是个默认值为false的boolean参数,用来判断连接本地还是线上数据库。
1 @Controller 2 @RequestMapping("api/case_info") 3 class DocEditAction { 4 …… 5 6 @ResponseBody 7 @RequestMapping(value = ["search"], method = [RequestMethod.GET]) 8 fun searchById(id: String, isLocal: Boolean = false): AnalyzeJson { 9 ………… 10 } 11 12 }
项目打成war包放到tomcat上运行时报错,报错信息如下:
public final XXX.AnalyzeJson XXX.DocEditAction.searchById(java.lang.String,boolean) to {[/api/case_info/search],methods=[GET]}: There is already 'docEditAction' bean method public static XXX.AnalyzeJson XXX.DocEditAction.searchById$default(XXX.DocEditAction,java.lang.String,boolean,int,java.lang.Object) mapped. 15:24:41 [http-nio-8660-exec-1] ERROR org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:502)- Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration: Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'docEditAction' method public final XXX.AnalyzeJson XXX.DocEditAction.searchById(java.lang.String,boolean) to {[/api/case_info/search],methods=[GET]}: There is already 'docEditAction' bean method
奇怪的是,这样的controller里的带默认参数的方法有好几个,以前也没有报过错。这期间发生的可能有关的变更有:
1.一个老哥写了个拦截器,处理了一下所有接收到的请求,“requestMappingHandlerMapping”就是新增加的一个bean
2.kotlin版本从1.2.30升级到了1.2.40
二、原因
没有找到根本的原因,推测是老哥写的拦截器那边有问题
三、解决方案
把方法里面的带默认值的参数写在了方法里面,之后重新打包丢到tomcat里启动就不报错了。
虽然感觉没有解决根本上的问题。
四、好像没什么关系的知识点
kotlin的默认参数方法使用@JvmOverloads可以将方法重载成多个java方法
1 @JvmOverloads fun A(a: Int, b: Int = 0) { 2 …… 3 } 4 会变成 5 6 public void A(int a) {} 7 public void A(int a, int b) {}
kotlin文档:https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html