当前位置: 首页 > 知识库问答 >
问题:

Java CDI:如何使用具有多个值的限定符在运行时更改生产者?

茹康裕
2023-03-14

我需要根据应用程序执行的环境(开发、测试、生产等)改变JDBC连接的注入方式。新环境的添加必须易于处理。因此,考虑到佩莱格里尼对以下问题的解决方案,我试图实施这种行为:

多个CDI配置文件(devel,beta,qa,生产)在一个战争?

注射点是这样的:

@Inject 
private Connection conn;

我有两个连接工厂

  1. ConnectionFactory:用于测试、验收和生产环境;
  2. ProxyConnectionFactory:仅适用于开发环境。
public inteface ConnectionFactory {
  public Connection getConnection();
}

@Environment({ "test", "acceptance", "production" })
public CustomConnectionFactory implements ConnectionFactory {
  public Connection getConnection() {
    // Implementation code
  }
}

@Environment({ "development" })
public ProxyCustomConnectionFactory implements ConnectionFactory {
  public Connection getConnection() {
    // Implementation code
  }
}

@Qualifier
@Target({ TYPE, METHOD, PARAMETER, FIELD })
@Retention(RUNTIME)
@Documented
public @interface Environment {
    String[] value() default {"production"};
}
public class ConnectionProducer {

  @Inject
  @Any
  Instance<ConnectionFacotry> connectionFactories;   

  public String getEnvironment(){
    return System.getProperty("deploy-environment");
  }

  @Produces
  public Connection produceConnection(){

    String[] profile = {getEnvironment().toLowerCase()};

    Instance<ConnectionFactory> found = connectionFactories.select(
      new EnvironmentQualifier(profile));
        if (!found.isUnsatisfied() && !found.isAmbiguous()){
          return found.get();
        }
        throw new RuntimeException("Error ...");
    }

    public static class EnvironmentQualifier 
      extends AnnotationLiteral<Environment> 
      implements Environment {      
      private String[] value;      
      public EnvironmentQualifier(String[] value) {
        this.value=value;      
      }             
      public String[] value() { return value; }
    }    

  }

如果有任何建议,我将不胜感激。

共有1个答案

卫骏
2023-03-14

我建议看一下deltaspike项目阶段特性。这似乎是一个很好的基础,为您的需要。

 类似资料:
  • 如何在运行时更改application.yaml的值?例如,我有一个服务器地址属性,希望在运行时更改

  • 当使用JOOQ为SQLServer数据库生成代码时,生成会创建由三部分组成的限定符,如:。这正是我在使用SQL服务器数据库时想要的,但是当使用生成的代码与另一个数据库(如内存数据库中的H2)进行单元测试时,这是一个问题。 H2方言不支持这些由三部分组成的限定词,H2期望类似于[目录]。[表]。这会在针对H2执行以下命令时导致语法错误: 为了解决这个问题,我需要在运行时更改限定符,我认为可以使用渲染

  • 问题内容: 我需要在运行时在应用程序中更改属性。例如,我有一项服务,该服务发送带有重置密码的电子邮件。要求有效期为12小时。但是我想在运行时将此时间更改为24或更多。我需要给管理员执行此操作的机会。 我的财产文件有 我的服务 我的Spring xml配置 我可以在运行时以某种方式更改此值吗? 问题答案: 只需远离xml配置,就快要到2017年了。 使用@Value,您将从属性文件中获取hours.

  • 我有一个Jtable,它由一个值数组填充。我的代码如下: 我可以使用JButton从值数组填充Jtable。我想有一个条件,如果列为“百分比”,则获取该列中的所有值 我不想使用TableCellRenderComponent。我希望在单击Jbutton时执行此操作。 然后根据我想要得到的,前两行应该以红色突出显示。谢谢你的帮助。

  • 问题内容: 在Dockerfile中,我有一个要安装的层: 当我构建Docker映像时, 无论 对该文件进行任何更改,它都会运行整个过程。 如何确保仅在文件发生更改的情况下运行Docker ? 问题答案: 我假设在构建过程中的某个时候,您正在使用或将整个应用程序复制到Docker映像中: 问题在于,每次将整个应用程序复制到映像时,您都会使Docker构建缓存无效。这还将使所有后续构建步骤的缓存无效

  • 假设您有以下扩展处理器接口的类: 现在,假设您在Package1的配置类中定义了以下bean: 接下来,您在Package2的配置类中定义以下bean: 问题是Spring如何解决以下喷射: 如果其中一个bean被注释为@Primary呢?