【问题标题】:Enabling CDI Decorator based on environmental properties根据环境属性启用 CDI Decorator
【发布时间】:2016-09-20 15:22:44
【问题描述】:

我知道可以在要部署的 EAR 中嵌入的“beans.xml”文件中配置装饰器。

问题是我对所有环境都使用相同的 EAR,而属性集或特定配置存储在包外的某个文件夹中。

我需要确定是否会使用装饰器“external beans.xml”或一些类似的机制(EAR 之外的东西)。

有什么想法吗?

非常感谢。

【问题讨论】:

    标签: java jakarta-ee jboss cdi


    【解决方案1】:

    通常,这不起作用 - 标准启用方式是 beans.xml 用于按存档方法,@Priority 用于全局启用。没有像“外部 beans.xml”这样的东西。

    虽然有一种方法可以通过 extension 启用它。您需要设置一个扩展并观察AfterTypeDiscovery event。从那里你可以 使用public List<Class<?>> getDecorators();,它返回MUTABLE 装饰器列表——所以你可以将你自己的添加到列表中(以Class 的形式)。这应该会启用它。

    【讨论】:

      【解决方案2】:

      您可以使用的另一种方案是利用构建时包含和处理。 如果您事先知道哪些属性会在构建时激活特定的装饰器,那么您可以使用 maven 资源以及系统属性来定义要过滤的其他资源,因此:

      <?xml version="1.0" encoding="UTF-8"?>
      <project xmlns="http://maven.apache.org/POM/4.0.0" 
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
               xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
          <modelVersion>4.0.0</modelVersion>
      
          <groupId>com.mycompant</groupId>
          <artifactId>my-project-id</artifactId>
          <version>1.0.0-SNAPSHOT</version>
          <packaging>war</packaging>
      
          <properties>
              <some.kind.of.selector.properties>$basedir}/src/main/resources/development</some.kind.of.selector.properties>
          </properties>
      
          <build>
              <resources>
                  <resource>
                      <directory>${some.kind.of.selector.properties}</directory>
                  </resource>
                  <resource>
                      <directory>src/main/resources</directory>
                  </resource>
              </resources>
          </build>
      
          <profiles>
              <profile>
                  <id>test</id>
                  <properties>
                      <some.kind.of.selector.properties>$basedir}/src/main/resources/test</some.kind.of.selector.properties>
                  </properties>
              </profile>
              <profile>
                  <id>prod</id>
                  <properties>
                      <some.kind.of.selector.properties>$basedir}/src/main/resources/prod</some.kind.of.selector.properties>
                  </properties>
              </profile>
          </profiles>
      </project>
      

      在构建时,您可以为每个环境指定不同的beans.xml

      mvn clean install -Pprod

      甚至直接指定属性

      mvn clean install -Dsome.kind.of.selector.properties=/path/to/additional/resources

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-11-03
        • 2012-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-15
        相关资源
        最近更新 更多