不同控制器中的Spring Boot REST映射冲突事件

时间:2016-11-03 16:27:54

标签: java spring spring-boot spring-restcontroller

我的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.

如果我删除一个控制器,一切都会好的,应用程序可以很好地启动。那么问题出在哪里?

2 个答案:

答案 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

  

<强>值
  在类型级别和方法级别受支持!在类型级别使用时,所有方法级别映射都会继承此主映射,并将其缩小为特定的处理程序方法。
  强调他们的