Java Spring Boot REST-即使使用唯一的路径变量,映射也不明确
我有两个端点,它们有一组不同的路径变量。除非我在URL中提供可选参数Java Spring Boot REST-即使使用唯一的路径变量,映射也不明确,java,spring,spring-boot,Java,Spring,Spring Boot,我有两个端点,它们有一组不同的路径变量。除非我在URL中提供可选参数(名称),否则它们都可以工作。然后Spring给出了模糊错误 可选参数name也出现在第二个端点中,这就是错误发生的原因 为什么Spring认为这些端点不明确? 必需的参数应使端点唯一(因为第一个端点包含参数“sourceid”,而第二个端点不包含参数)。以下URL给出了错误信息: /?sourceid=999&AppliantId=1&startingdate=2020&endingdate=2021&name=mobilea
(名称)
,否则它们都可以工作。然后Spring给出了模糊错误
可选参数name
也出现在第二个端点中,这就是错误发生的原因
为什么Spring认为这些端点不明确?
必需的参数应使端点唯一(因为第一个端点包含参数“sourceid”,而第二个端点不包含参数)。以下URL给出了错误信息:
/?sourceid=999&AppliantId=1&startingdate=2020&endingdate=2021&name=mobileapp
第一个端点:
@GetMapping(value=“/”,params={“sourceid”、“applicationId”、“startingdate”、“endingdate”})
公共列表GetEventsByd(
@RequestParam(“sourceid”)字符串sourceid,
@RequestParam(“AppliantId”)字符串AppliantId,
@RequestParam(“startingdate”)字符串startingdate,
@RequestParam(“endingdate”)字符串endingdate,
@RequestParam(value=“name”,required=false)字符串名){
第二个端点:
@GetMapping(value=“/”,params={“name”、“applicationId”、“startingdate”、“endingdate”})
公共列表GetEventsByApplicationId(
@RequestParam(“AppliantId”)字符串AppliantId,
@RequestParam(“名称”)字符串名称,
@RequestParam(“startingdate”)字符串startingdate,
@RequestParam(“endingdate”)字符串(endingdate){
错误消息:
java.lang.IllegalStateException: Ambiguous handler methods mapped for '/event-example/': {public java.util.List com.eventrest.controller.MyController.getEventsById(java.lang.String,java.lang.String,java.lang.String,java.lang.String) throws java.text.ParseException, public java.util.List com.eventrest.controller.MyController.getEventsByApplicantId(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String) throws java.text.ParseException}
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:413) ~[spring-webmvc-5.2.9.RELEASE.jar:5.2.9.RELEASE]
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:367) ~[spring-webmvc-5.2.9.RELEASE.jar:5.2.9.RELEASE]
at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:110) ~[spring-webmvc-5.2.9.RELEASE.jar:5.2.9.RELEASE]
at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:59) ~[spring-webmvc-5.2.9.RELEASE.jar:5.2.9.RELEASE]
at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:396) ~[spring-webmvc-5.2.9.RELEASE.jar:5.2.9.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1234) ~[spring-webmvc-5.2.9.RELEASE.jar:5.2.9.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1016) ~[spring-webmvc-5.2.9.RELEASE.jar:5.2.9.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) ~[spring-webmvc-5.2.9.RELEASE.jar:5.2.9.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.2.9.RELEASE.jar:5.2.9.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.2.9.RELEASE.jar:5.2.9.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.38.jar:4.0.FR]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.2.9.RELEASE.jar:5.2.9.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.38.jar:4.0.FR]
Spring无法区分请求是否得到
http://localhost:8080/?sourceid=999&applicantid=1&startingdate=2020&endingdate=2021&name=mobileapp
将由getEventsById()
或getEventsByApplicantId()
处理,因为映射不明确
考虑到第二种方法中的sourceid
是required=false
,与第一种方法中的相同,这两种方法自然是相同的
有一种方法可以摆脱模棱两可的局面。
您可以根据请求参数条件缩小请求映射范围。您可以测试是否存在请求参数(myParam)、是否没有(!myParam)或是否存在特定值(myParam=myValue)
将!sourceid
添加到getEventsByApplicantId()
方法中的参数字段中,如下所示:
@GetMapping(value=“/”,params={“!sourceid”,“name”,“applicationId”,“startingdate”,“endingdate”})
公共列表GetEventsByApplicationId(
@RequestParam(“AppliantId”)字符串AppliantId,
@RequestParam(“名称”)字符串名称,
@RequestParam(“startingdate”)字符串startingdate,
@RequestParam(“endingdate”)字符串(endingdate){
// ..
}
Spring无法区分请求是否得到http://localhost:8080/?sourceid=999&applicantid=1&startingdate=2020&endingdate=2021&name=mobileapp
将由getEventsById()
或getEventsByApplicantId()
处理,因为映射不明确
考虑到第二种方法中的sourceid
是required=false
,与第一种方法中的相同,这两种方法自然是相同的
有一种方法可以摆脱模棱两可的局面。
您可以根据请求参数条件缩小请求映射范围。您可以测试是否存在请求参数(myParam)、是否没有(!myParam)或是否存在特定值(myParam=myValue)
将!sourceid
添加到getEventsByApplicantId()
方法中的参数字段中,如下所示:
@GetMapping(value=“/”,params={“!sourceid”,“name”,“applicationId”,“startingdate”,“endingdate”})
公共列表GetEventsByApplicationId(
@RequestParam(“AppliantId”)字符串AppliantId,
@RequestParam(“名称”)字符串名称,
@RequestParam(“startingdate”)字符串startingdate,
@RequestParam(“endingdate”)字符串(endingdate){
// ..
}
我不知道这是否能解决您的问题,也不知道这对于非必需参数是否有必要,但我看到了“名称”第一个终结点的参数中缺少param。终结点不明确。您必须具有唯一的请求映射,而不考虑请求参数。这些不是路径变量,只是常规请求参数。请添加正确的代码(似乎不匹配)和实际异常。@Gaetitan这不起作用。如果“name”参数被添加到params中,使其成为必需参数,并且如果没有“name”参数,URL将不再工作。如果“name”参数包含在URL中,同样的模糊错误出现。@M.Deinum不匹配是什么意思?这是一个稍微简化的代码,但实际代码与更多参数相似。我不知道这是否能解决您的问题,也不知道这对于非必需的参数是否必要,但我看到了“名称”第一个终结点的参数中缺少param。终结点不明确。您必须具有唯一的请求映射,而不考虑请求参数。这些不是路径变量,只是常规请求参数。请添加正确的代码(似乎不匹配)和实际异常。@Gaetitan这不起作用。如果“name”参数被添加到params中,使其成为必需参数,并且如果没有“name”参数,URL将不再工作。如果“name”参数包含在URL中,同样的模糊错误出现。@M.Deinum不匹配是什么意思?这是一个稍微简化的代码,但实际代码与更多参数相似。太棒了!这是一个简单的解决方案,即使经过几天疯狂的谷歌搜索,我也没有遇到过。我想我的谷歌技能(搜索词组合)需要一点改进。谢谢!太棒了!这么简单的解决方案,我甚至没有遇到f