【问题标题】:What does the value in @RestController annotation do?@RestController 注解中的值有什么作用?
【发布时间】:2020-03-15 20:18:46
【问题描述】:

使用Maven 创建一个简单的Spring Boot 应用程序。我用RestController 注释给出了一个值,但它不起作用。如果我不使用RestController 的值,它可以工作。我想知道,为什么它不起作用以及@RestController 中的值有什么用?

http://localhost:9090/app/hello 这给出了错误

http://localhost:9090/hello 这工作正常

@RestController("/app")"/app"这个值在@RestController注解里面的作用是什么?

P.S:我知道,我可以在 ScraperResource 类上使用@RequestMapping("/app")

@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}
@RestController("/app")
public class ScraperResource {
    @GetMapping("hello")
    public String testController() {
        return "Hello";
    }
}

application.properties

server.port=9090

【问题讨论】:

    标签: java spring spring-boot rest


    【解决方案1】:

    这是因为 RestController 中的“/app”与您的 URL 映射无关,而是与 Spring 内部使用的 “逻辑组件”名称 .

    如果您想在所有控制器方法前加上 /app(或直接省略),则应该这样做。

    @RestController
    @RequestMapping("/app")
    public class ScraperResource {
    
        @GetMapping("hello")
        public String testController() {
            return "Hello";
        }
    }
    

    没有@RestController,Spring 不会知道这个类应该处理 HTTP 调用,所以它是一个必需的注解。

    【讨论】:

      【解决方案2】:

      根据与 @RestController 注释关联的 Java Doc,这是您传递给它的值的含义:

      /**
           * The value may indicate a suggestion for a logical component name,
           * to be turned into a Spring bean in case of an autodetected component.
           * @return the suggested component name, if any (or empty String otherwise)
           * @since 4.0.1
           */
          @AliasFor(annotation = Controller.class)
          String value() default "";
      

      因此,它不会影响或影响您的端点可以访问的 URL。如果你想添加一个顶级映射,你可以在你提到的类级别上使用@RequestMapping("/app")

      【讨论】:

        【解决方案3】:

        @Controller注解中的参数允许你命名Controller。如果有多个相同类型的bean,可以使用bean名称和@Qualifier注解,让Spring知道在自动装配期间要注入哪个组件。

        来自documentation

        当一个组件作为扫描过程的一部分被自动检测时,它的 bean 名称由已知的 BeanNameGenerator 策略生成 扫描器。默认情况下,任何 Spring 原型注解 (@Component, @Repository、@Service 和 @Controller) 包含名称值 从而将该名称提供给相应的 bean 定义。

        如果这样的注释不包含名称值或任何其他检测到的 组件(例如通过自定义过滤器发现的组件),默认 bean 名称生成器返回未大写的非限定类 名字。

        阅读有关自动装配消歧的更多信息,以及如何将组件名称与 @Qualifier here 一起使用。

        默认情况下,Spring 按类型解析 @Autowired 条目。如果超过 容器、框架中有一个相同类型的 bean 将引发致命异常。

        为了解决这个冲突,我们需要明确告诉 Spring 哪个 bean 我们要注入。

        当有多个相同类型的bean时,这是个好主意 使用@Qualifier 来避免歧义。

        请注意@Qualifier 注解的值与 在 FooFormatter 的 @Component 注释中声明的名称 实施。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-10-18
          • 1970-01-01
          • 2015-01-15
          • 2020-03-19
          • 1970-01-01
          • 2015-07-31
          • 1970-01-01
          • 2019-02-16
          相关资源
          最近更新 更多