在我的Spring Boot应用程序中,我有大约30个控制器类。每个类都有一个@CrossOrigin
批注。当我在eclipse上进行处理时很好,但是当我部署到生产环境时,我需要删除它们。
因此,我正在考虑在application.properties
中创建一个自定义属性,并以某种方式将其绑定到CrossOrigin注释。因此,我可以设置属性my-annotation=false
,这将取消应用程序中各处的CrossOrigin批注。我试着研究反射,但不知道该怎么做。
我该如何进行这项工作?
答案 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
放入仅在生产环境或某些环境中加载的应用程序属性中