Java 如何使用Spring Rest控制器解决不明确的映射?

Java 如何使用Spring Rest控制器解决不明确的映射?,java,rest,spring-mvc,spring-boot,Java,Rest,Spring Mvc,Spring Boot,我已经看了下面的帖子 (一) (二) (三) (四) 但我还没有弄明白如何解决我的问题。我正在创建一个Spring Boot web应用程序,其中我试图将以下端点映射到两个不同的方法 我的职能如下 @RequestMapping(name="/quiz/questions/{quizId}", method=RequestMethod.GET) public ResponseEntity<QuizQuestion> questions(@PathVariable String

我已经看了下面的帖子

(一)

(二)

(三)

(四)

但我还没有弄明白如何解决我的问题。我正在创建一个Spring Boot web应用程序,其中我试图将以下端点映射到两个不同的方法

我的职能如下

  @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);
  }
我得到以下错误

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 
org.springframework.beans.factory.BeanCreationException:创建名为“requestMappingHandlerMapping”的bean时出错,该名称在类路径资源[org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]中定义:初始化方法调用失败;嵌套异常为java.lang.IllegalStateException:不明确映射。无法映射“/myapplication”方法
public com.project.myapplication.Score com.project.myapplication.QuizController.getScore(java.lang.String)
对于{[],methods=[GET]}:已经有了“/myapplication”bean方法
public org.springframework.http.ResponseEntity.com.project.myapplication.QuizController.questions(java.lang.String)已映射。
在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628)~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
. . . . . . .  .. . 
原因:java.lang.IllegalStateException:映射不明确。无法映射“/myapplication”方法
public com.project.myapplication.Score com.project.myapplication.QuizController.getScore(java.lang.String)
对于{[],methods=[GET]}:已经有了“/myapplication”bean方法
public org.springframework.http.ResponseEntity.com.project.myapplication.QuizController.questions(java.lang.String)已映射。
在org.springframework.web.servlet.handler.AbstractHandlerMethodMapping$MappingRegistry.assertUniqueMethodMapping(AbstractHandlerMethodMapping.java:576)~[spring-webmvc-4.3.12.RELEASE.jar:4.3.12.RELEASE]
在

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

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

@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(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);
}
注意而不是名称


为了进一步澄清,您可以检查,这解释了不同的参数
name
参数只是为映射提供了一个名称。
参数是关键参数。

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

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

你能显示myapplication端点吗?不相关的注意:你的两个方法实际上没有相同的签名,只有相同的参数。对于同一个签名,它们的名称必须相同,但事实并非如此。方法名和它的参数类型定义了方法签名。。。“注意值而不是名称。”出于某种原因,我决定尝试在这个控制器中使用名称