【问题标题】:Spring Boot REST mapping conflict event in different controller不同控制器中的 Spring Boot REST 映射冲突事件
【发布时间】:2016-11-03 16:27:53
【问题描述】:

我的 Spring boot(1.4.0 RELEASE) 应用中有两个 Rest 控制器:

@RestController("/ctrl")
public class TestController {
    @GetMapping
    public void test() {

    }
}


@RestController("/ctrl2")
public class TestController2 {
    @GetMapping
    public void test() {

    }
}

当我运行 Spring Boot 应用程序时:

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.

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

【问题讨论】:

  • @Veeram 即使更改为完全不同的路径也无法正常工作

标签: java spring spring-boot spring-restcontroller


【解决方案1】:

您所要做的就是像这样更改您的代码:

@RestController
@RequestMapping("/ctrl")
public class TestController {
    @GetMapping
    public void test() {

    }
}


@RestController
@RequestMapping("/ctrl2")
public class TestController2 {
    @GetMapping
    public void test() {

    }
}

请注意,我已将 RequestMapping 注释添加到控制器中。

@RestController 注释中使用的名称与映射无关。它用作将在 Spring 上下文中注册的 bean 的名称

【讨论】:

  • 非常感谢,我在想@RestController value 和 @RequestMapping value 是一样的,但它们是完全不同的东西!
  • @July 这是一个常见的误解!很容易混淆
【解决方案2】:

让我们看看JavaDoc for @RestController

价值
该值可能表示对逻辑组件名称的建议,在自动检测到组件的情况下将其转换为 Spring bean。

所以您已经声明了一个名为 /ctrl 的控制器 bean 和另一个名为 /ctrl2 的控制器 bean,它们都映射到 /

你是不是想说:

@RestController
@RequestMapping("/ctrl")
public class TestController {
    @GetMapping
    public void test() {

    }
}

来自JavaDoc for @RequestMapping


在类型级别和方法级别都受支持!在类型级别使用时,所有方法级别映射都继承此主映射,针对特定的处理程序方法缩小范围。
强调他们的

【讨论】:

    猜你喜欢
    • 2012-05-12
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多