【问题标题】:How to resolve ambiguous mapping with Spring Rest Controllers?如何使用 Spring Rest Controller 解决不明确的映射?
【发布时间】:2018-05-16 22:16:57
【问题描述】:

我看过以下帖子

1) Error creating bean with name 'requestMappingHandlerAdapter'

2)Spring Boot Ambiguous mapping. Cannot map method

3)Spring mvc Ambiguous mapping found. Cannot map controller bean method

4) Spring MVC Ambiguous mapping. Cannot map

但我无法弄清楚如何解决我的问题。我正在创建一个 Spring Boot Web 应用程序,我在其中尝试将以下端点 /quiz/score/{quizId}/quiz/questions/{quizId} 端点映射到两个单独的方法。

我的功能如下

  @RequestMapping(name="/quiz/questions/{quizId}", method=RequestMethod.GET)
  public ResponseEntity<QuizQuestion> questions(@PathVariable String quizId) {
    QuizQuestion question = this.quizService.fetchQuestion(quizId);
    if (question == null) {
      return new ResponseEntity<QuizQuestion>(HttpStatus.NOT_FOUND);
    }
    return new ResponseEntity<QuizQuestion>(question, HttpStatus.OK);
  }

@RequestMapping(name="/quiz/score/{id}", method=RequestMethod.GET)
  public Score getScore(@PathVariable("id") String quizId) {
    return this.quizService.getScore(quizId);
  }

我收到以下错误

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping. Cannot map '/myapplication' method 
public com.project.myapplication.Score com.project.myapplication.QuizController.getScore(java.lang.String)
to {[],methods=[GET]}: There is already '/myapplication' bean method
public org.springframework.http.ResponseEntity<com.project.myapplication.QuizQuestion> com.project.myapplication.QuizController.questions(java.lang.String) mapped.
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]

. . . . . . .  .. . 

Caused by: java.lang.IllegalStateException: Ambiguous mapping. Cannot map '/myapplication' method 
public com.project.myapplication.Score com.project.myapplication.QuizController.getScore(java.lang.String)
to {[],methods=[GET]}: There is already '/myapplication' bean method
public org.springframework.http.ResponseEntity<com.project.myapplication.QuizQuestion> com.project.myapplication.QuizController.questions(java.lang.String) mapped.
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping$MappingRegistry.assertUniqueMethodMapping(AbstractHandlerMethodMapping.java:576) ~[spring-webmvc-4.3.12.RELEASE.jar:4.3.12.RELEASE]
    at 

我知道两个方法具有相同的签名,但它们有两个唯一的端点。我该如何解决这个问题?

【问题讨论】:

  • 你能显示我的应用程序端点吗?
  • 无关注意:您的两个方法实际上没有相同的签名,只是相同的参数。对于相同的签名,它们需要以相同的名称命名,但事实并非如此。方法名称及其参数类型定义了方法签名。

标签: java rest spring-mvc spring-boot


【解决方案1】:

您的问题是您已经像这样指定了端点:

@RequestMapping(name="/quiz/score/{id}", method=RequestMethod.GET)
public Score getScore(@PathVariable("id") String quizId) {
    return this.quizService.getScore(quizId);
}

但它们应该是这样的:

@RequestMapping(value="/quiz/score/{id}", method=RequestMethod.GET)
public Score getScore(@PathVariable("id") String quizId) {
    return this.quizService.getScore(quizId);
}

注意 value 而不是 name

如需进一步说明,您可以查看RequestMapping javadoc,其中解释了不同的参数。 name 参数只是为您的映射提供了一个名称。 value 参数是关键。

【讨论】:

  • +1 这是小事......“注意价值而不是名称。”出于某种原因,我决定尝试在这个控制器中使用名称
【解决方案2】:

使用 value 代替 name 或者您可以使用方法特定的注释

@GetMApping("/name")
@PostMApping("/name")
@PutMApping("/name")
@DeleteMApping("/name")

【讨论】:

    猜你喜欢
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 2012-06-21
    • 2017-12-24
    • 2023-04-02
    相关资源
    最近更新 更多