如何将注释与弹簧属性联系起来?

时间:2018-10-23 05:00:39

标签: spring-boot

在我的Spring Boot应用程序中,我有大约30个控制器类。每个类都有一个@CrossOrigin批注。当我在eclipse上进行处理时很好,但是当我部署到生产环境时,我需要删除它们。

因此,我正在考虑在application.properties中创建一个自定义属性,并以某种方式将其绑定到CrossOrigin注释。因此,我可以设置属性my-annotation=false,这将取消应用程序中各处的CrossOrigin批注。我试着研究反射,但不知道该怎么做。

我该如何进行这项工作?

1 个答案:

答案 0 :(得分:3)

恐怕,spring不能以这种方式工作-在所有控制器上都添加了注解之后。

从技术上讲,此注释在春季MVC (org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping#initCorsConfiguration)中的较深处使用,因此不建议对其进行摆弄。

可能有可能通过自定义实现覆盖此类型的Bean,并将其置于仅在生产中进行且默认情况下不会加载的某些配置。但这又是“内部”解决方案。

相反,我建议在控制器外部创建全局cors配置,因此不会有@CrossOrigin注释留在控制器中。

因此,第一步将定义一个WebConfigurerAdapter

@Configuration
class MyGlobalCorsConfiguration {
 @Bean
 public WebMvcConfigurer corsConfigurer() {
    return new WebMvcConfigurerAdapter() {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/greeting").allowedOrigins("http://localhost:9000");
        }
    };
 }
}

第二步是仅在某些特定条件下应用此配置:

可以将@ConditionalOnProperties注释放在整个配置或单个bean上:

@ConditionalOnProperty(value = "myproject.cors.enabled", havingValue = "true", 
 matchIfMissing = false)
@Configuration
class MyGlobalCorsConfiguration {
 ....
}

现在,在第三步中,您应该将属性myproject.cors.enabled=true放入仅在生产环境或某些环境中加载的应用程序属性中