我遇到了一个我不明白的奇怪问题和错误信息。我在JBoss 7 EAP上运行我的应用程序。
Caused by: java.lang.ClassCastException: Cannot cast ejbs.LoginManager$417755913$Proxy$_$$_Weld$EnterpriseProxy$ to ejbs.LoginManager
我正在尝试使用其接口以编程方式从CDI上下文中检索EJB,并收到此错误消息。我已经创建了一个示例概念验证,试图从CDI上下文中检索EJB bean
public <T> T getSesionBean(Class<T> clazz, String name) {
Properties properties = new Properties();
try {
InitialContext initContext = new InitialContext();
return clazz.cast(CDI.current().select(clazz).get());
} catch (Exception e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
}
}
它被称为:
LoginManager login = getSesionBean(LoginManager.class);
将我的EJB定义为:
@Stateless(name="LoginManager")
@Local(LoginManager.class)
@LocalBinding(jndiBinding="LoginManager")
public class LoginManagerBean implements LoginManager {
...
...
...
}
我不明白。我期待从上下文中检索的bean是代理。它不应该可以转换为我的界面吗?否则,我该如何找回它?
更有趣的是,这似乎不是一致的错误;有时代码工作正常。有时会失败。我无法确定是什么使它起作用或抛出异常。
我发现了一个相关的问题here,但不确定这是否是同一个问题和/或JB7EAP中使用的是哪个版本的Weld。我在我的应用程序中包含以下依赖项:
<dependency>
<groupId>org.wildfly</groupId>
<artifactId>wildfly-ejb-client-bom</artifactId>
<version>10.1.0.Final</version>
<type>pom</type>
</dependency>
我做错了吗?如果这是一个Weld错误,我可以使用与Weld不同的代理系统吗?