@RestController注解中的value值是什么意思?

4
使用Maven创建一个简单的Spring Boot应用程序。我使用@RestController注释给了一个值,但它不起作用。如果我不使用@RestController的值,则可以正常工作。我想知道,为什么它不起作用?@RestController中value的用途是什么?
http://localhost:9090/app/hello会出错
http://localhost:9090/hello可以正常工作
@RestController("/app"):@RestController注释中"/app"这个值的目的是什么?
附注:我知道我可以在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
3个回答

8
由于您的 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")


0

@Controller 注解中的参数允许您命名控制器。在存在多个相同类型的bean的情况下,可以使用 bean 名称以及 @Qualifier 注解来让 Spring 知道在自动装配期间注入哪个组件。

文档中了解更多:

当一个组件在扫描过程中被自动检测到时,它的 bean 名称是由该扫描器知道的 BeanNameGenerator 策略生成的。默认情况下,任何 Spring 构造型注解(@Component、@Repository、@Service 和 @Controller)都包含名称值,因此为相应的 bean 定义提供名称。

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

了解有关自动连线消歧的更多信息,以及如何将组件名称与 @Qualifier一起使用

默认情况下,Spring会按类型解析@Autowired注入的项。 如果容器中有多个相同类型的bean,则框架将抛出致命异常。 为解决此冲突,我们需要显式地告诉Spring要注入哪个bean。 当存在多个相同类型的bean时,最好使用@Qualifier以避免歧义。 请注意,@Qualifier注释的值与我们的FooFormatter实现的@Component注释中声明的名称匹配。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接