简体   繁体   English

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

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

I have looked at the following posts 我查看了以下帖子

1) Error creating bean with name 'requestMappingHandlerAdapter' 1) 创建名为'requestMappingHandlerAdapter'的bean时出错

2) Spring Boot Ambiguous mapping. 2) Spring Boot模糊映射。 Cannot map method 无法映射方法

3) Spring mvc Ambiguous mapping found. 3) 找到Spring mvc Ambiguous mapping。 Cannot map controller bean method 无法映射控制器bean方法

4) Spring MVC Ambiguous mapping. 4) Spring MVC模糊映射。 Cannot map 无法映射

But I have not been able to figure out how to resolve my issue. 但我一直无法弄清楚如何解决我的问题。 I am creating a Spring Boot web application in which I am trying to map the following endpoints /quiz/score/{quizId} and /quiz/questions/{quizId} endpoints to two separate methods. 我正在创建一个Spring Boot Web应用程序,我试图将以下端点/quiz/score/{quizId}/quiz/questions/{quizId}端点/quiz/questions/{quizId}到两个单独的方法。

My functions are as follows 我的功能如下

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

and

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

I am getting the following error 我收到以下错误

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 

I know that two methods have the same signature, but they have two unique endpoints. 我知道两种方法具有相同的签名,但它们有两个唯一的端点。 How can I resolve this issue? 我该如何解决这个问题?

Your problem is that you've specified your endpoints like this: 您的问题是您已经指定了这样的端点:

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

But they should be like this: 但它们应该是这样的:

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

Note the value instead of name . 请注意而不是名称

For further clarification, you can check RequestMapping javadoc , which explains the different parameters. 为了进一步说明,您可以检查RequestMapping javadoc ,它解释了不同的参数。 name parameter just gives a name for your mapping. name参数只是为您的映射命名。 The value parameter is the key one. value参数是关键参数。

Use value in place of name or you can use method Specific annotation 使用代替名称,或者您可以使用方法特定注释

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

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

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