繁体   English   中英

如何使用Spring Rest Controllers解决模糊映射?

[英]How to resolve ambiguous mapping with Spring Rest Controllers?

我查看了以下帖子

1) 创建名为'requestMappingHandlerAdapter'的bean时出错

2) Spring Boot模糊映射。 无法映射方法

3) 找到Spring mvc Ambiguous mapping。 无法映射控制器bean方法

4) Spring MVC模糊映射。 无法映射

但我一直无法弄清楚如何解决我的问题。 我正在创建一个Spring Boot Web应用程序,我试图将以下端点/quiz/score/{quizId}/quiz/questions/{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 

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

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

@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);
}

请注意而不是名称

为了进一步说明,您可以检查RequestMapping javadoc ,它解释了不同的参数。 name参数只是为您的映射命名。 value参数是关键参数。

使用代替名称,或者您可以使用方法特定注释

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM