我们目前正在开发一个部署在WebSphere服务器上的应用程序。该应用程序应该使用内部服务提供者,该服务提供者提供对作为远程EJB实现的服务的访问。服务提供者bean有一些硬编码的jndi名称可供使用。
现在在开发过程中,我们正在使用Tomee,总的来说一切都运行良好。除了一件事:ServiceProvider对“cell/持久/confiService”进行jndi查找。现在我尝试创建一个包含这些服务的模拟EJB的模拟耳朵。我能够部署它们,并且能够使用jndi名称从应用程序访问它们,例如:“java: global/frameme-mock-ear-1.0.0-SNAPSHOT/frame-mock-impl/ConfigServiceMock”,但似乎不可能使用jndi查找:“cell/持久/confiService”…现在我在模拟实现中添加了一个openejb-jar.xml文件,其中包含:
<openejb-jar>
<ejb-deployment ejb-name="ConfigServiceMock">
<jndi name="cell/persistent/configService"
interface="de.thecompany.common.services.config.ConfigService"/>
</ejb-deployment>
</openejb-jar>
在启动过程中,我可以看到bean似乎以该名称正确注册:
INFORMATION: Jndi(name=cell/persistent/configService) --> Ejb(deployment-id=ConfigServiceMock)
但是我现在知道如何让另一只耳朵能够使用这个名称访问这个bean。
服务提供商部分已经给出,我们根本无法更改,因此请不要建议更改硬编码的jndi名称。我们当然愿意这样做,但无法改变任何事情。
我知道这个问题几年后会有答案,但是一个更简单的解决方案是简单地设置系统属性如下(比如在catalina.properties中):
java.naming.initial.factory=org.apache.openejb.core.OpenEJBInitialContextFactory
这允许您通过设置的名称查找ejb,以及在启动期间在tomee日志中显示的名称,例如您的“cell/持久/confiService”
INFORMATION: Jndi(name=cell/persistent/configService) --> Ejb(deployment-id=ConfigServiceMock)
通过设置系统属性,您可以按照您想要的方式查找ejb
final Context ctx = new InitialContext();
ctx.lookup("cell/persistent/configService")
OpenEJBInitialContextFactory允许访问本地EJB和容器资源。
如果您不想设置系统属性(因为它会影响本书中的所有应用程序),您仍然可以使用工厂设置的“标准”方式:
Properties properties = new Properties();
properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.core.OpenEJBInitialContextFactory");
final Context ctx = new InitialContext(properties);
ctx.lookup("cell/persistent/configService");
当然,您仍然可以使用全局“java: global/”以及该工厂查找它们。
好的……我在这上面浪费了很多时间。直到我终于想出了一个解决方案。我没有配置Tomee和OpenEJB来查找我的bean,而是劫持了LaunalContext并重写了我的查询。
package de.mycompany.mock.tomee;
import org.apache.naming.java.javaURLContextFactory;
import javax.naming.Context;
import javax.naming.NamingException;
import java.util.Hashtable;
public class MycompanyNamingContextFactory extends javaURLContextFactory {
private static Context initialContext;
@Override
public Context getInitialContext(Hashtable environment) throws NamingException {
if(initialContext == null) {
Hashtable childEnv = (Hashtable) environment.clone();
childEnv.put("java.naming.factory.initial", "org.apache.naming.java.javaURLContextFactory");
initialContext = new MycompanyInitialContext(childEnv);
}
return initialContext;
}
}
通过设置系统属性
java.naming.factory.initial=de.mycompany.mock.tomee.MycompanyNamingContextFactory
我能够注入我的MycompanyInitialContext上下文实现:
package de.mycompany.mock.tomee;
import org.apache.openejb.core.ivm.naming.IvmContext;
import org.apache.openejb.core.ivm.naming.NameNode;
import javax.naming.NamingException;
import java.util.Hashtable;
public class MycomanyInitialContext extends IvmContext {
public MycomanyInitialContext(Hashtable<String, Object> environment) throws NamingException {
super(environment);
}
@Override
public Object lookup(String compositName) throws NamingException {
if("cell/persistent/configService".equals(compositName)) {
return super.lookup("java:global/mycompany-mock-ear-1.0.0-SNAPSHOT/mycompany-mock-impl/ConfigServiceMock");
}
if("cell/persistent/authorizationService".equals(compositName)) {
Object obj = super.lookup("java:global/mycompany-mock-ear-1.0.0-SNAPSHOT/mycompany-mock-impl/AuthServiceMock");
return obj;
}
return super.lookup(compositName);
}
}
我知道这并不漂亮,如果有人知道如何使这变得更容易和更漂亮,我洗耳恭听,这个解决方案似乎很有效。因为它只是为了在开发过程中模拟生产服务,所以这个黑客不会给我带来任何噩梦。我只是想把它贴出来,以防其他人发现类似的事情。
本文向大家介绍phpMyAdmin安装并配置允许空密码登录,包括了phpMyAdmin安装并配置允许空密码登录的使用技巧和注意事项,需要的朋友参考一下 下载phpMyAdmin,解压到apache的web目录中 http://www.phpmyadmin.net/ 访问 http://127.0.0.1/phpMyAdmin/index.php 用数据库的用户名和密码即可登录。 如果出现“空密码登
我有一个子目录()我想访问的是在我的站点的根文件夹。我看了这里: https://wordpress.stackexchange.com/questions/20152/cannot-access-non-wordpress-subdirectories-as-wordpress-overrides-them-with-a-40 我已经尝试了解决方案,但没有任何效果。 我还尝试将一个单独的文件添加
试图在下载目录中保存PDF文件,但在Android Q后,被完全弃用后,除了DCIM或Pictures文件夹之外,没有办法将文件保存到任何其他位置,因为在尝试将文件保存到该位置时引发了以下异常。 有以下代码。 显然,当将路径更改为DIRECTORY_DCIM时,所有工作都按预期进行,但由于需要,文件应该像以前一样保存到下载中。会很感激任何帮助。
我有一个spring boot应用程序,它有两个功能:Http请求和kafka消息处理。我希望这个应用程序在application.yml中启用的模式下运行,也就是说,如果用户只希望为http请求启用它,那么kafka就不应该被连接。 我可以使用普通的spring boot kafka插件通过使用@KafkaListener的以下属性禁用自动配置来实现这一点, autoStartup=“${mod
问题内容: 我正在建立一个站点,在该站点中我想从textarea元素的值创建文件客户端。 我有执行此操作的代码,但出现此错误 HTTP错误404.15-找不到请求过滤模块配置为在查询字符串过长的情况下拒绝请求。 有没有一种方法可以覆盖它,以便我能够处理任何大小的请求? 如果没有,有没有办法在不使用文件系统/活动x对象的情况下生成客户端文件? 谢谢 问题答案: 将以下内容添加到您的web.confi
问题内容: 当我尝试整理Es6类时,ESLint引发错误。我缺少在eslint中启用胖箭头类方法的配置参数吗? 范例类别: .eslint 问题答案: 如果要使用实验性功能(例如箭头作为类方法),则需要用作解析器。默认解析器(Espree)不支持实验性功能。