Mar*_*uer 6 java jboss containers detect java-ee
感谢大家的帮助.你发布了一些(我应该预料到的)答案,表明我的整个方法都是错误的,或者低级代码永远不必知道它是否在容器中运行.我倾向于同意.但是,我正在处理一个复杂的遗留应用程序,并且没有选择对当前问题进行重大重构.
让我退后一步,问问题是我原来问题的动机.
我有一个在JBoss下运行的遗留应用程序,并对低级代码进行了一些修改.我为我的修改创建了一个单元测试.为了运行测试,我需要连接到数据库.
遗留代码以这种方式获取数据源:
(jndiName是一个已定义的字符串)
Context ctx = new InitialContext();
DataSource dataSource = (DataSource) ctx.lookup(jndiName);
Run Code Online (Sandbox Code Playgroud)
我的问题是,当我在单元测试下运行此代码时,Context没有定义数据源.我的解决方案是尝试查看我是否在应用程序服务器下运行,如果没有,则创建测试DataSource并返回它.如果我在app服务器下运行,那么我使用上面的代码.
所以,我真正的问题是:这样做的正确方法是什么?是否有一些批准的方式单元测试可以设置上下文以返回适当的数据源,以便被测代码不需要知道它在哪里运行?
对于上下文:我的原始问题:
我有一些Java代码需要知道它是否在JBoss下运行.是否有规范的方法来判断代码是否在容器中运行?
我的第一种方法是通过实验开发出来的,包括获取初始上下文和测试它可以查找某些值.
private boolean isRunningUnderJBoss(Context ctx) {
boolean runningUnderJBoss = false;
try {
// The following invokes a naming exception when not running under
// JBoss.
ctx.getNameInNamespace();
// The URL packages must contain the string "jboss".
String urlPackages = (String) ctx.lookup("java.naming.factory.url.pkgs");
if ((urlPackages != null) && (urlPackages.toUpperCase().contains("JBOSS"))) {
runningUnderJBoss = true;
}
} catch (Exception e) {
// If we get there, we are not under JBoss
runningUnderJBoss = false;
}
return runningUnderJBoss;
}
Context ctx = new InitialContext();
if (isRunningUnderJboss(ctx)
{
.........
Run Code Online (Sandbox Code Playgroud)
现在,这似乎有效,但感觉就像一个黑客.这样做的"正确"方法是什么?理想情况下,我想要一种适用于各种应用程序服务器的方法,而不仅仅是JBoss.
整个方法对我来说感觉不对。如果您的应用程序需要知道它正在哪个容器中运行,那么您就做错了。
当我使用 Spring 时,我可以从 Tomcat 移动到 WebLogic 并返回,而无需进行任何更改。我确信,通过正确的配置,我也可以对 JBOSS 执行相同的操作。这就是我的目标。
| 归档时间: |
|
| 查看次数: |
1728 次 |
| 最近记录: |