场景:
Spring Boot应用程序应公开其REST端点 仅当发生特定操作时。
Spring中有什么方法可以延迟公开端点,甚至整个HTTP子系统吗?
在Apache CXF中,我们可以执行以下操作:
void exposeEndpoints() {
EndpointImpl endpoint = new EndpointImpl(cxfBus, serviceImpl);
endpoint.publish();
}
春季如何做同样的事情?
答案 0 :(得分:1)
您可以看看@RefreshScope
。
我将按以下方式定义@RestController
bean:
@Configuration
@RefreshScope
public ControllerConfig {
@Bean
@ConditionalOnProperty(value = "should.initialize.rest", havingValue = true)
public SomeController someController(){
....
}
@Bean
@ConditionalOnProperty(value = "should.initialize.rest", havingValue = true)
public SomeOtherController someOtherController(){
....
}
}
,并且如果您在should.initialize.rest
中以值为false
的属性application.properties
启动应用程序:
should.initialize.rest=false
那么您的控制器将不会被注册/初始化。应用程序运行时,您可以将application.properties
更新为:
should.initialize.rest=true
并调用/refresh
,然后您的ApplicationContext
将使用REST控制器重新加载/刷新。您可以在下面找到有关@RefreshScope
的更多信息:
答案 1 :(得分:1)
我在下面提供的解决方案是方法之一,它可能适合您的情况,也可能不合适。 这种情况似乎更多地与设计有关,而不是特定的实现。 我建议您在设计上几乎不要改动。
另一种方法是使用方面创建自定义注释。您可以根据需要而不是在整个服务层上使用该批注。 第一种方法的好处是您可以在通用级别上控制,第二种方法可以在服务级别上使用。
答案 2 :(得分:0)
我建议使用您的HTTP子系统创建一个新的子上下文。像这样:
@Service
public class MyBusinessService {
@Autowired
private final ApplicationContext parentContext;
private AnnotationConfigWebApplicationContext webContext;
public void myBusinessMethod() {
this.webContext = new AnnotationConfigWebApplicationContext();
this.webContext.setParent(parentContext);
this.webContext.scan("com.mybusiness.service.webcomponents");
this.webContext.refresh();
this.webContext.start();
}
}
免责声明:这是概念验证代码,我没有尝试编译或运行它。但希望足以说明这个概念。