在我的Maven,Spring Boot 2项目中,我有一个名为String
的Maven模块。我在那里宣布了一些api1
。
为了扩展@RestController
模块的逻辑,我实现了另一个名为api1
的Maven模块,并将api2
放在那里作为Maven依赖。
现在,来自api1
项目的所有@RestController
都在api1
中初始化,因为所有这些都存在于api2
类路径中。
如何禁用api2
项目中的某个@RestController
?
答案 0 :(得分:1)
我认为这里要理解的关键事实是Spring只在运行时工作,而maven在构建时间很重要。
所以maven看到api2依赖于api1所以它理解两个模块都必须包含在工件中(在spring boot的情况下它是一个包含所有模块的大罐子。)
现在,当春天开始 - 它"理所当然"所有模块都是可访问的,并且根据弹簧配置,它只定义要加载和处理的bean,当然所有其他控制器都在这些bean中。
所以我假设,你不介意在工件中(以及在类路径中)有两个模块。
在这种情况下,你根本不应该触摸maven部分,但是当弹簧启动应用程序启动时,它必须被指示"不知何故,必须排除一些休息控制器。重点是它不应该在模块方面完成("嘿,春天,这个控制器属于模块api2,所以它必须被排除"),但在业务方面"行话& #34 ;.例如,api1包含所有" admin"功能和api2包含所有" applicative"东西。因此,例如,如果您使用Java配置,则可以执行以下操作:
内部模块api1:
@Configuration
@ConditionalOnProperty(name = "admin.enabled", havingValue=true)
public class AdminControllersConfiguration {
@Bean
public AdminControllerFromModuleApi1 adminController() {
return new AdminControllerFromModuleApi1();
}
}
}
在模块api2中,您只需以类似的方式定义您的休息控制器,但不要使用" @ ConditionalOnProperty"注释
这个注释的东西是它允许"关闭" bean或整个配置,如我的例子。
因此,当您启动api2时,您只需定义" application.properties"或以下内容:
admin.enabled=false
你的控制器不会被部署"虽然在春天,但文件肯定在类路径中。
当然,由于spring允许不同类型的配置,这种方法可能不适用于您的项目,但这个想法仍然是相同的。
答案 1 :(得分:1)
您可以尝试使用Spring中的Condition接口,它根据特定条件/表达式提供对bean的条件启用/禁用的支持。
如下所示:
@RestController
@ConditionalOnExpression("${api1.controller.enabled:false}")
@RequestMapping(value = "/", produces = "application/json;charset=UTF-8")
public class Api1Controller {
@RequestMapping(value = "/greeting")
public ResponseEntity<String> greeting() {
return new ResponseEntity<>("Hello world", HttpStatus.OK);
}
}
你必须通过某种方式设置条件表达式(env.variable / property key)。检查this以获取一些参考。 Condition docs可以为您提供更多详细信息。