gpt4 book ai didi

java - JNDI 上下文仅工作一次(使用 jUnit 进行 EJB 测试)

转载 作者:行者123 更新时间:2023-12-01 10:37:14 25 4
gpt4 key购买 nike

我正在尝试实现 jUnit 来测试 EJB。如果我使用 JNDI 上下文一次,则测试工作正常。但是,如果我第二次使用上下文,我会得到以下异常:

java.lang.IllegalStateException: No EJB receiver available for handling
[appName:Name, moduleName:NameEJB, distinctName:] combination for
invocation context org.jboss.ejb.client.EJBClientInvocationContext
at org.jboss.ejb.client.EJBClientContext.requireEJBReceiver(
EJBClientContext.java:774)
...

测试类的setUp()如下所示:

private NameDAO nameDAO;

@Before
public void setUp() throws Exception {

try {
final Hashtable<String, Comparable> jndiProperties =
new Hashtable<String, Comparable>();

jndiProperties.put(Context.PROVIDER_URL, "http-remoting://localhost:8080");
jndiProperties.put(Context.SECURITY_PRINCIPAL, "user");
jndiProperties.put(Context.SECURITY_CREDENTIALS, "password");
jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY,
"org.jboss.naming.remote.client.InitialContextFactory");
jndiProperties.put("jboss.naming.client.ejb.context", true);

final Context context = new InitialContext(jndiProperties);

final String lookupName = "Name/NameEJB/NameBean!com.myname.ejb.interfaces.NameDAO";

nameDAO = (NameDAO) context.lookup(lookupName);

} catch (Exception e) {
throw e;
}
}

第一次在测试中使用nameDAO对象效果很好。第二次使用会抛出上面的异常。

有什么想法吗?

我正在使用 Java EE 7 和 Wildfly 9。

感谢您的帮助。

最佳答案

您想要做的是“保留”并重用不同方法对 EJB 服务 (nameDAO) 的引用。您所缺少的是,最终当您进行查找并获取引用时,您将获得一个bean的代理,该代理要么由服务器动态创建(要么您获得一个池代理)。当您调用服务并完成它时,容器会将实例返回到池中(或销毁它) - 取决于服务器和规范版本。第二次不起作用的原因是,您在测试中作为私有(private)变量持有的这个特定代理并未指向“实时”实例。您需要向容器发出新请求(查找)以获取另一个实例。

您可以做的一项修改实际上是将 Context 作为私有(private)变量,然后在每个测试方法中再次进行查找以获取新的实例(代理)。

最后但并非最不重要的一点是,我强烈建议您看看 Arquillian,它使这种测试更容易实现和维护。查看官方指南here或示例帖子here

希望有帮助:)

关于java - JNDI 上下文仅工作一次(使用 jUnit 进行 EJB 测试),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34600430/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com