0
点赞
收藏
分享

微信扫一扫

@GetMapping 的值一样,但是方法参数不一样报错问题处理

@GetMapping 注解是 Spring MVC 中的一个注解,它用于标识 HTTP GET 请求处理程序方法。其值表示请求的 URL 路径。

如果两个 @GetMapping 注解声明在不同的方法上,但路径相同,那么 Spring MVC 就会认为它们都能够处理该路径对应的 GET 请求。这时,Spring MVC 会根据请求中参数的类型和名字来确定调用哪个方法,从而实现多态(Polymorphism)特性,即同一个请求路径有多个处理程序方法可以处理。

例如:

@GetMapping("/test")
public String handleGetRequest() {
    return "Hello, World!";
}

@GetMapping("/test")
public String handleGetRequest(@RequestParam("name") String name) {
    return "Hello, " + name + "!";
}

这里,我们定义了两个 @GetMapping 注解,它们都声明了 /test 路径,但是它们的方法参数不同。第一个方法没有任何参数,返回字符串 "Hello, World!";第二个方法带有一个名为 name 的请求参数,并返回字符串 "Hello, {name}!"。当请求 /test 路径时,如果没有提供 name 参数,第一个方法将被调用,否则第二个方法将被调用。

所以,当您在编写多个具有相同路径但不同参数的处理程序方法时,确保它们的行为正确且互补,以避免混淆和错误。

但是这样会报错

这样写报错,
to {GET [/test]}: There is already 'testController' bean method
cn.yinguoqing.demo1.TestController#test() mapped.
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1804) ~[spring-beans-5.3.27.jar:5.3.27]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620) ~[spring-beans-5.3.27.jar:5.3.27]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.27.jar:5.3.27]
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.27.jar:5.3.27]
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.27.jar:5.3.27]
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.27.jar:5.3.27]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.27.jar:5.3.27]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:955) ~[spring-beans-5.3.27.jar:5.3.27]
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:920) ~[spring-context-5.3.27.jar:5.3.27]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.27.jar:5.3.27]
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) ~[spring-boot-2.7.11.jar:2.7.11]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731) [spring-boot-2.7.11.jar:2.7.11]
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) [spring-boot-2.7.11.jar:2.7.11]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) [spring-boot-2.7.11.jar:2.7.11]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) [spring-boot-2.7.11.jar:2.7.11]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) [spring-boot-2.7.11.jar:2.7.11]
	at cn.yinguoqing.demo1.Demo1Application.main(Demo1Application.java:10) [classes/:na]
Caused by: java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'testController' method 
cn.yinguoqing.demo1.TestController#test(String)
to {GET [/test]}: There is already 'testController' bean method
cn.yinguoqing.demo1.TestController#test() mapped.
	at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping$MappingRegistry.validateMethodMapping(AbstractHandlerMethodMapping.java:669) ~[spring-webmvc-5.3.27.jar:5.3.27]
	at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping$MappingRegistry.register(AbstractHandlerMethodMapping.java:635) ~[spring-webmvc-5.3.27.jar:5.3.27]
	at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.registerHandlerMethod(AbstractHandlerMethodMapping.java:332) ~[spring-webmvc-5.3.27.jar:5.3.27]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.registerHandlerMethod(RequestMappingHandlerMapping.java:420) ~[spring-webmvc-5.3.27.jar:5.3.27]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.registerHandlerMethod(RequestMappingHandlerMapping.java:76) ~[spring-webmvc-5.3.27.jar:5.3.27]
	at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lambda$detectHandlerMethods$2(AbstractHandlerMethodMapping.java:299) ~[spring-webmvc-5.3.27.jar:5.3.27]
	at java.util.LinkedHashMap.forEach(LinkedHashMap.java:684) ~[na:1.8.0_352]
	at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.detectHandlerMethods(AbstractHandlerMethodMapping.java:297) ~[spring-webmvc-5.3.27.jar:5.3.27]
	at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.processCandidateBean(AbstractHandlerMethodMapping.java:266) ~[spring-webmvc-5.3.27.jar:5.3.27]
	at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.initHandlerMethods(AbstractHandlerMethodMapping.java:225) ~[spring-webmvc-5.3.27.jar:5.3.27]
	at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.afterPropertiesSet(AbstractHandlerMethodMapping.java:213) ~[spring-webmvc-5.3.27.jar:5.3.27]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.afterPropertiesSet(RequestMappingHandlerMapping.java:205) ~[spring-webmvc-5.3.27.jar:5.3.27]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863) ~[spring-beans-5.3.27.jar:5.3.27]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800) ~[spring-beans-5.3.27.jar:5.3.27]
	... 16 common frames omitted

这个错误提示是因为您定义了两个 @GetMapping 注解,并且它们都声明了 /test 路径,但是方法参数不同。这导致 Spring MVC 无法确定应该调用哪个方法来处理请求。

为了解决这个问题,您需要使每个请求路径唯一。您可以使用一个不同的 URL 路径或者更改方法参数以使其不同。例如:

@GetMapping("/test")
public String handleGetRequest() {
    return "Hello, World!";
}

@GetMapping("/test/{name}")
public String handleGetRequestWithName(@PathVariable("name") String name) {
    return "Hello, " + name + "!";
}

在这里,我们将第二个方法的路径更改为 /test/{name},其中 {name} 是一个动态路径参数。这使得它与第一个方法的路径不同。另外,我们将 name 参数定义为 @PathVariable 注释的方法参数。

举报

相关推荐

0 条评论