Java 在同一个耳朵里从一场战争中调用EJB
我用的是玻璃鱼。我有一个耳朵,它有一个战争和一个装有EJB的罐子 我想从WAR调用EJB,但不确定是否需要使用本地或远程接口 在我的罐子里,我的豆子看起来像这样:Java 在同一个耳朵里从一场战争中调用EJB,java,jakarta-ee,glassfish,ejb,ejb-3.0,Java,Jakarta Ee,Glassfish,Ejb,Ejb 3.0,我用的是玻璃鱼。我有一个耳朵,它有一个战争和一个装有EJB的罐子 我想从WAR调用EJB,但不确定是否需要使用本地或远程接口 在我的罐子里,我的豆子看起来像这样: @Stateless public class Test implements TestLocal { @Override public void testing() { } } @WebService(serviceName = "TestWS") public class TestWS { p
@Stateless
public class Test implements TestLocal {
@Override
public void testing() {
}
}
@WebService(serviceName = "TestWS")
public class TestWS {
private @EJB TestLocal testBean;
@WebMethod(operationName = "test")
public String test() {
testBean.test();
}
}
和我的本地人:
@Local
public interface TestLocal {
void testing();
}
在我的WAR中,我有一个web服务,它看起来是这样的:
@Stateless
public class Test implements TestLocal {
@Override
public void testing() {
}
}
@WebService(serviceName = "TestWS")
public class TestWS {
private @EJB TestLocal testBean;
@WebMethod(operationName = "test")
public String test() {
testBean.test();
}
}
这两种都封装在一个耳朵里
当我调用我的WebService方法时,我得到一个AccessLocalException:
警告:javax.ejb.AccessLocalException:客户端未授权
这是在
com.sun.ejb.containers.BaseContainer.preInvokeBaseContainer.java:1895
在
com.sun.ejb.containers.ejbLocalObjectInLocationHandler.InvokeeJBLocalObjectInLocationHandler.java:210
首先:
这是调用EJB的正确方法吗。EAR中的WAR可以使用包含JAR的本地接口吗?
如果是这样,那么有人知道我做错了什么吗?我需要设置某种安全配置吗?
要查找远程EJB,它必须公开一个远程接口。将远程接口包括到您的war中 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 module.jar或web module.war是否打包在application.ear中,并且在特定于Sun的应用程序级别Sun-application.xml中没有角色映射信息。对于任何application.ear,必须在sun-application.xml中指定安全角色映射信息。模块级XML和应用程序级XML都可以接受。@Remote是有用的,例如,如果您将包含EJB的jar单独部署在不同的服务器上 在这里,war和jar位于同一个ear中,因此您只需使用本地注释 提示:由于EJB3.1接口不是必需的,您可以直接在测试类上使用@LocalBean并删除TestLocal接口 要将ejb方法调用到war类中,首先必须在war和jar之间创建一个链接。同一只耳朵是不够的。
如果您使用Maven,您只需在war的pom中将jar引用添加到您的依赖项中。您是否为EJB设置了任何安全配置?我认为这并不完全正确。如果EJBJAR是EAR的一个模块,那么它的所有类都可用于WAR。通过compile添加对POM的引用将EJBJAR添加到WAR/WEB-INF/lib文件夹,如果EJBJAR已经是EAR的一个模块,则不需要该文件夹。