Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在同一个耳朵里从一场战争中调用EJB_Java_Jakarta Ee_Glassfish_Ejb_Ejb 3.0 - Fatal编程技术网

Java 在同一个耳朵里从一场战争中调用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

我用的是玻璃鱼。我有一个耳朵,它有一个战争和一个装有EJB的罐子

我想从WAR调用EJB,但不确定是否需要使用本地或远程接口

在我的罐子里,我的豆子看起来像这样:

@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的一个模块,则不需要该文件夹。