【发布时间】:2015-07-11 13:43:04
【问题描述】:
不能将 EJB 从一个模块注入到另一个模块中的 EJB。单个 glassfish 实例上的两个模块。
主模块中的远程接口:
@Remote
public interface TestEJBLocal {
String getMessage();
}
在主模块中的实现:
@Stateless
public class TestEJB implements TestEJBRemote {
@Override
public String getMessage() {
return "Hello EJB World";
}
}
第 3 方模块中的远程接口(消费者):
@Remote
public interface TestEJBLocal {
String getMessage();
}
3rdparty 模块中的消费者 bean:
@Named
@RequestScoped
public class testBean {
@EJB(lookup="java:global/mavenproject3-ear/mavenproject3-ejb-1.0-SNAPSHOT/TestEJB!com.versetty.ejb.TestEJBRemote")
private TestEJBRemote messageBean;
public void doEJBCall() {
System.out.println(messageBean.getMessage());
}
}
消费者 JSF 页面:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
Hello from Facelets
<h:form>
<h:commandButton action="#{testBean.doEJBCall()}" title="call"/>
</h:form>
</h:body>
</html>
例外:
Caused by: java.lang.IllegalArgumentException: Can not set com.versetty.web.remote.TestEJBRemote field com.versetty.web.bean.testBean.messageBean to com.versetty.ejb._TestEJBRemote_Wrapper
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:81)
at java.lang.reflect.Field.set(Field.java:764)
at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl._inject(InjectionManagerImpl.java:688)
... 59 more
【问题讨论】:
-
当然,该错误表明您正在查找与您在注入点指定的不同的 bean 定义:com.versetty.web.remote.TestEJBRemote 和 com.versetty.ejb._TestEJBRemote_Wrapper 代理 bean将具有相同的包命名
-
它有效。非常感谢。
标签: jakarta-ee glassfish ejb