我正在使用Glassfish 4.我有一个EAR,它有一个WAR和一个JAR(带有EJB)。
我想从我的WAR调用EJB,但我不确定是否需要使用本地或远程接口。
在我的JAR 中,我的Bean看起来像这样:
@Stateless
public class Test implements TestLocal {
@Override
public void testing() {
}
}
我的当地人:
@Local
public interface TestLocal {
void testing();
}
在我的内部 我有一个网络服务,它看起来像这样:
@WebService(serviceName = "TestWS")
public class TestWS {
private @EJB TestLocal testBean;
@WebMethod(operationName = "test")
public String test() {
testBean.test();
}
}
这两个都打包成 EAR 。
当我调用我的WebService方法时,我得到 AccessLocalException :
Warnung:javax.ejb.AccessLocalException:客户端未获得授权 这个调用在 com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:1895) 在 com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:210)
首先:
答案 0 :(得分:0)
要查找远程EJB,它必须公开远程接口。将远程接口包括在你的战争中。
GlassFish文档中包含此错误的条目:
javax.ejb.AccessLocalException: Client Not Authorized Error
描述
角色映射信息在Sun特定的XML中可用(例如,sun-ejb-jar.xml),并且身份验证是可以的,但会显示以下错误消息:
[...INFO|sun-appserver-pe8.0|javax.enterprise.system.container.ejb|...|
javax.ejb.AccessLocalException: Client not authorized for this invocation.
at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:...
at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(...)
解决方案
检查EJB模块(.jar)或Web模块(.war)是否打包在应用程序(.ear)中,并且在应用程序级别(Sun特定的sun-application.xml)中没有角色映射信息。对于任何应用程序(.ear),必须在sun-application.xml中指定安全角色映射信息。拥有模块级XML和应用程序级XML是可以接受的。
答案 1 :(得分:0)
在那里,war和jar在同一个耳中,所以你只需要使用Local注释。
提示:由于不需要EJB 3.1接口,您可以直接在“Test”类上使用@LocalBean并删除TestLocal接口。
要将ejb方法调用到您的战争类中,首先必须在war和jar之间创建一个链接。处于同一个耳朵是不够的。 如果您使用Maven,您只需将jar引用添加到战争中的依赖项中即可。