Spring Boot,Maven,在派生项目中禁用特定的RestController

时间:2018-03-22 07:09:26

标签: spring maven spring-boot spring-restcontroller

在我的Maven,Spring Boot 2项目中,我有一个名为String的Maven模块。我在那里宣布了一些api1

为了扩展@RestController模块的逻辑,我实现了另一个名为api1的Maven模块,并将api2放在那里作为Maven依赖。

现在,来自api1项目的所有@RestController都在api1中初始化,因为所有这些都存在于api2类路径中。

如何禁用api2项目中的某个@RestController

2 个答案:

答案 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可以为您提供更多详细信息。