我的Spring启动(1.4.0 RELEASE)应用程序中有两个Rest控制器:
@RestController("/ctrl")
public class TestController {
@GetMapping
public void test() {
}
}
@RestController("/ctrl2")
public class TestController2 {
@GetMapping
public void test() {
}
}
当我运行Spring启动应用程序时:
Caused by: java.lang.IllegalStateException: Ambiguous mapping. Cannot map '/ctrl2' method
public void com.xxx.controller.TestController2.test()
to {[],methods=[GET]}: There is already '/ctrl' bean method
public void com.xxx.controller.TestController.test() mapped.
如果我删除一个控制器,一切都会好的,应用程序可以很好地启动。那么问题出在哪里?
答案 0 :(得分:4)
您所要做的就是更改代码:
@RestController
@RequestMapping("/ctrl")
public class TestController {
@GetMapping
public void test() {
}
}
@RestController
@RequestMapping("/ctrl2")
public class TestController2 {
@GetMapping
public void test() {
}
}
请注意,我已将RequestMapping
注释添加到控制器。
您在@RestController
注释中使用的名称与映射无关。它被用作将在Spring上下文中注册的bean的名称
答案 1 :(得分:2)
让我们看一下JavaDoc for @RestController
:
<强>值强>
该值可以指示对逻辑组件名称的建议,以便在自动检测组件的情况下变为Spring bean。
所以你已经解析了一个名为/ctrl
的控制器bean和另一个名为/ctrl2
的控制器bean,它们都映射到/
!
你的意思是:
@RestController
@RequestMapping("/ctrl")
public class TestController {
@GetMapping
public void test() {
}
}
来自JavaDoc for @RequestMapping
:
<强>值强>
在类型级别和方法级别受支持!在类型级别使用时,所有方法级别映射都会继承此主映射,并将其缩小为特定的处理程序方法。
强调他们的