在一场战争中使用多个 CDI 配置文件(开发、测试版、质量保证、生产)?

2023-12-28

拥有使用 Spring DI applicationContext.xml 声明依赖注入的方式的经验后,我现在尝试弄清楚如何使用 Java EE6 CDI 执行相同的操作。

使用 Spring,我可以将我的 .jar 与多个配置文件一起发送,例如unittest.xml、devel.xml、qa.xml、生产.xml并使用命令行参数或环境变量激活它们。

通过 CDI,我可以在中使用 @Alternativebeans.xml和属性在web.xml但似乎没有办法为不同的环境传送多个 beans.xml 。

我不想使用 Maven 配置文件/过滤器来生成我的应用程序的 4-6 个版本,尽管我知道对于某些场景来说,这将是更好的解决方案(即将准备好的构建战争交付给客户 - 但我只在内部使用我的战争,所以让我们节省编译时间!)

最好,我还能够从文件系统加载这些配置文件,以便系统管理员可以编辑它们,而无需重新构建应用程序。

Java EE6 拥有多个依赖项和属性配置集的方式是什么?

如果没有,截至 2013 年推荐的替代方案是什么?使用Spring?接缝?吉斯?我看到有人提到 Apache DeltaSpike,但从网页来看它们似乎仍然是 alpha。


我会使用动态生成器,使用Qualifier确定所需的环境

// The qualifier for the production/qa/unit test 
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD,
 ElementType.FIELD, ElementType.PARAMETER})
public @interface Stage {
   String value() default "production";
}

// The interface for the stage-dependant service
public interface Greeting{
    public String sayHello();
}

// The production service
@Stage("production")
public class ProductionGreeting implements Greeting{
    public String sayHello(){return "Hello customer"; }
}

// The QA service
@Stage("qa")
public class QAGreeting implements Greeting{
    public String sayHello(){return "Hello tester"; }
}

// The common code wich uses the service
@Stateless
public class Salutation{
   @Inject Greeting greeting; 
   public String sayHello(){ return greeting.sayHello(); };
}

// The dynamic producer
public class GreetingFactory{
    @Inject
    @Any
    Instance<Greeting> greetings;        

    public String getEnvironment(){
         return System.getProperty("deployenv");
    }

    @Produces
    public Greeting getGreeting(){
        Instance<Greeting> found=greetings.select(
           new StageQualifier(getEnvironment()));
        if (!found.isUnsatisfied() && !found.isAmbiguous()){
           return found.get();
        }
        throw new RuntimeException("Error ...");
    }

    public static class StageQualifier 
      extends AnnotationLiteral<Stage> 
      implements Stage {
       private String value;

       public StageQualifier(String value){
           this.value=value;
       }
       public String value() { return value; }
     }

}

所以这里容器注入所有可用的Greeting实施到GreetingFactory,这反过来又充当@Producer对于预期的,根据系统属性“deployenv”做出决定。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在一场战争中使用多个 CDI 配置文件(开发、测试版、质量保证、生产)? 的相关文章

  • Quarkus / CDI 和“java config”DI 定义

    我刚刚开始 quarkus 概念验证 容器启动时间太棒了 现在 我正在研究依赖注入部分 并找出选项 https quarkus io blog quarkus dependency injection https quarkus io bl
  • Android:文本淡入和淡出

    我已阅读此 stackoverflow 问题和答案 并尝试实现文本淡入和淡出 Android中如何让文字淡入淡出 https stackoverflow com questions 8627211 how to make text fade
  • Thymeleaf 3 Spring 5 映射加载字符串而不是 HTML

    我正在尝试将 Spring 5 和 Thymeleaf 3 一起配置 我正在 Eclipse 上工作 我使用 全新安装 构建并使用 springboot run 运行应用程序 我已经设置了一个控制器和几个模板 但 Thymeleaf 似乎找
  • 如何调试“com.android.okhttp”

    在android kitkat中 URLConnection的实现已经被OkHttp取代 如何调试呢 OkHttp 位于此目录中 external okhttp android main java com squareup okhttp 当
  • 如何在 JPQL 或 HQL 中进行限制查询?

    在 Hibernate 3 中 有没有办法在 HQL 中执行相当于以下 MySQL 限制的操作 select from a table order by a table column desc limit 0 20 如果可能的话 我不想使用
  • Jframe 内有 2 个 Jdialogs 的 setModal 问题

    当我设置第一个选项时 我遇到了问题JDialog模态 第二个非模态 这是我正在尝试实现的功能 单击 测试对话框 按钮 一个JDialog有名字自定义对话框 主要的将会打开 如果单击 是 选项自定义对话框主 其他JDialog named 自
  • 将非 Android 项目添加到 Android 项目

    我在 Eclipse 中有三个项目 Base Server 和 AndroidClient Base和Server是Java 1 7项目 而AndroidClient显然是一个android项目 基础项目具有在服务器和 Android 客户
  • 将人类日期(当地时间 GMT)转​​换为日期

    我正在服务器上工作 服务器正在向我发送 GMT 本地日期的日期 例如Fri Jun 22 09 29 29 NPT 2018在字符串格式上 我将其转换为日期 如下所示 SimpleDateFormat simpleDateFormat ne
  • Akka 与现有 java 项目集成的示例

    如果我已经有现有的javaWeb 应用程序使用spring and servlet容器 将 Akka 集成到其中的正确方法是什么 就像我将会有Actor1 and Actor2互相沟通的 开始使用这些演员的切入点是什么 例如 1 把它放在那
  • 如何使用 JMagick 转换色彩空间?

    如何使用 JMagick API 转换色彩空间 例如 CMYK gt RGB 和 RGB gt CMYK None
  • 在Java中运行bat文件并等待

    您可能会认为从 Java 启动 bat 文件是一项简单的任务 但事实并非如此 我有一个 bat 文件 它对从文本文件读取的值循环执行一些 sql 命令 它或多或少是这样的 FOR F x in CD listOfThings txt do
  • 如何在JPanel中设置背景图片

    你好 我使用 JPanel 作为我的框架的容器 然后我真的想在我的面板中使用背景图片 我真的需要帮助 这是我到目前为止的代码 这是更新 请检查这里是我的代码 import java awt import javax swing import
  • 不可变的最终变量应该始终是静态的吗? [复制]

    这个问题在这里已经有答案了 在java中 如果一个变量是不可变的并且是final的 那么它应该是一个静态类变量吗 我问这个问题是因为每次类的实例使用它时创建一个新对象似乎很浪费 因为无论如何它总是相同的 Example 每次调用方法时都会创
  • Java Swing - 如何禁用 JPanel?

    我有一些JComponents on a JPanel我想在按下 开始 按钮时禁用所有这些组件 目前 我通过以下方式显式禁用所有组件 component1 setEnabled false 但是有什么办法可以一次性禁用所有组件吗 我尝试禁用
  • 将 JavaFX FXML 对象分组在一起

    非常具有描述性和信息性的答案将从我这里获得价值 50 声望的赏金 我正在 JavaFX 中开发一个应用程序 对于视图 我使用 FXML
  • 部署 .war 时出现 Glassfish 服务器错误:部署期间发生错误:准备应用程序时出现异常:资源无效

    我正在使用以下内容 NetBeans IDE 7 3 内部版本 201306052037 爪哇 1 7 0 17 Java HotSpot TM 64 位服务器虚拟机 23 7 b01 NetBeans 集成 GlassFish Serve
  • 列表过滤器内的 Java 8 lambda 列表

    示例 JSON id 1 products id 333 status Active id 222 status Inactive id 111 status Active id 2 products id 6 status Active
  • java XMLSerializer 避免复杂的空元素

    我有这个代码 DocumentBuilderFactory factory DocumentBuilderFactory newInstance DocumentBuilder builder factory newDocumentBuil
  • Java 正则表达式中的逻辑 AND

    是否可以在 Java Regex 中实现逻辑 AND 如果答案是肯定的 那么如何实现呢 正则表达式中的逻辑 AND 由一系列堆叠的先行断言组成 例如 foo bar glarch 将匹配包含所有三个 foo bar 和 glarch 的任何
  • java'assert'和'if(){}else exit;'之间的区别

    java和java有什么区别assert and if else exit 我可以用吗if else exit代替assert 也许有点谷歌 您应该记住的主要事情是 if else 语句应该用于程序流程控制 而assert 关键字应该仅用于

随机推荐

  • 如何检测未使用的宏定义和 typedef?

    通过链接器反馈很容易获得未使用的函数和变量的列表 但如何检测这些未使用的宏定义和 typedef 我必须在整个项目中逐行浏览代码和 git grep 吗 对于源文件中定义的宏 您可以尝试 Wunused macrosgcc clang 标志
  • 选择排序从两端开始增长有序范围

    我编写了选择排序的修改版本 其中我考虑数组的最小值和最大值并将它们放在两端 该算法的工作原理如下 1 Find the minimum and the maximum value in the list 2 Swap the minimum
  • PHP串口数据从Arduino返回

    我想知道是否有一种方法可以通过 PHP 读取我的串行端口 有效 在练习 Arduino 技能时 我开发了一个简单的 LED 开 关草图 它的工作原理是输入on or off在串行监视器中 下一步 我整理了一个网页作为 GUI 界面 用于单击
  • 预期响应为 <:redirect>,但实际响应为 <200>

    我的 rspec 测试遇到问题 浏览了之前的问题后我无法解决它 测试失败并出现上述错误 但代码在实践中有效 有谁知道如何解决这个问题 Rspec describe authentication of edit update pages do
  • 请求运行时权限时出现java.lang.StackOverflowError

    我创建了一个公共类PermissionManager为了从一个地方管理所有权限 通常它工作正常 但上传后它显示崩溃分析的错误报告我无法重现 详细信息如下所述 Fatal Exception java lang StackOverflowEr
  • 无法关闭 Matplotlib 中的科学计数法[重复]

    这个问题在这里已经有答案了 我使用以下代码在 Matplotlib Python 中绘制一个简单的图 temp np array 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 99999999 0 99999999 0 999
  • 多个 Eclipse IDE 应用程序未显示在 Launchpad 上

    我需要有关 Launchpad 上 Eclipse IDE 的帮助 我有 Mac OS X Yosemite 并且下载了 Eclipse IDE Java PHP 和 C C 在我提取 Eclipse IDE Java 并将其拖放到我的应用
  • 无法使用 VS 2022 调试 WSL2 - 无效的“cwd”值

    我尝试在 Windows 中使用 VS 2022 IDE 从 WSL2 进行调试 但出现以下错误 cwd 值确实看起来错误 但如何修复它 我正在使用 netcore 6 0 101 Ubuntu 20 04 3 和 Windows 11 启
  • 垂直对齐在内联块中不起作用

    我想将文本垂直居中 但是 这行不通 当我将文本放入内联块中时 我应该能够将文本垂直居中 对吧 为什么这段代码不起作用 我怎样才能使它起作用 请帮帮我 先感谢您 HTML ul class socialBlock li class socia
  • 通过点击单元格内的图像从 UITableViewCell 中转出

    我已经尝试解决这个问题有一段时间了 经过几个小时的寻找解决方案后 我决定是时候问了 我有一个由自定义 UITableViewCells 填充的表格视图 当前当您点击单元格时 它会将您带到详细视图 自定义单元格内有一个图像 我希望用户能够点击
  • ListView 显示字符串时出现问题

    任何人都可以帮助我在我的应用程序中以列表视图显示一组结果 我得到以下内容 codeList
  • 模拟挂起 lambda 在 Mockito 中返回 null

    依赖关系 testImplementation androidx arch core core testing 2 0 0 testImplementation org mockito mockito core 3 3 0 testImpl
  • 回合制多人骷髅演示应用程序

    我正在尝试让基于回合制多人游戏的演示应用程序正常工作 但遇到了问题 我已经编译并运行了代码 但每当我尝试实际连接或创建游戏时 都会收到此错误 DrawingActivity 13235 没有警告或字符串要处理 6003 该错误代码对应于此
  • 确定 CRAN 上 R 包历史版本的数量

    是否可以确定 CRAN 上的某个包过去拥有的版本数 这是一个使用XML包裹 这只是计算存档版本 更准确地说 是存档版本的数量 tar gz文件 加 1 即可得到版本总数 包括当前版本 nCRANArchived lt function pk
  • 使用相同的方法签名发布和获取

    在我的控制器中 我有两个名为 朋友 的操作 执行哪个取决于它是 get 还是 post 所以我的代码片段看起来像这样 Get AcceptVerbs HttpVerbs Get public ActionResult Friends do
  • PHP 是否有等效的forever.js 来连续运行我的脚本?

    我偶尔使用永远 js https github com nodejitsu forever用于将 CLI 类型的 Node js 应用程序快速而肮脏地部署到我不希望完全启动的生产环境中监督者 http supervisord org 部署
  • PyQt 无法识别箭头键

    我正在尝试编写一个 目前非常 简单的 PyQt 应用程序 并希望允许用户使用箭头键进行导航 而不是单击按钮 我已经实现了基础知识 并且在我的主要内容中QWidget 我覆盖keyPressEvent 现在 我所要求的就是它发出警报 QMes
  • “‘SELECT *’仅对单个输入集有效。”

    尝试学习沙箱中的查询语法 https www documentdb com sql demo https www documentdb com sql demo SELECT food id FROM food JOIN t in food
  • 使用 WPF C# 创建后台热键的正确方法? (最好不使用遗留代码)

    我需要能够为 WPF 应用程序设置后台热键事件 通过背景 我的意思是所讨论的应用程序可能不一定是焦点 我知道使用 WinForms 的正确方法是导入 user32 dll 并使用 RegisterHotKey 并捕获适当的 WM POST
  • 在一场战争中使用多个 CDI 配置文件(开发、测试版、质量保证、生产)?

    拥有使用 Spring DI applicationContext xml 声明依赖注入的方式的经验后 我现在尝试弄清楚如何使用 Java EE6 CDI 执行相同的操作 使用 Spring 我可以将我的 jar 与多个配置文件一起发送 例