1

我正在使用 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();
}

在我的 WAR中,我有一个 Web 服务,它看起来像这样:

@WebService(serviceName = "TestWS")
public class TestWS {

    private @EJB TestLocal testBean;

    @WebMethod(operationName = "test")
    public String test() {
    testBean.test();
    }
}

这两个都被打包到一个EAR中。

当我调用我的 WebService 方法时,我得到一个AccessLocalException

警告:javax.ejb.AccessLocalException:客户端未授权在 com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:1895) 在 com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java: 210)

首先 :

  • 这是调用 EJB 的正确方法吗?EAR 中的 WAR 可以使用包含的 JAR 中的本地接口吗?
  • 如果是这样,那么有人知道我做错了什么吗?我需要设置某种安全配置吗?
4

2 回答 2

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-specific、sun-application.xml 中没有角色映射信息。对于任何应用程序 (.ear),必须在 sun-application.xml 中指定安全角色映射信息。同时具有模块级 XML 和应用程序级 XML 是可以接受的。

于 2013-11-15T11:24:25.747 回答
0

例如,如果您在不同的服务器上单独部署包含 EJB 的 jar,@Remote 很有用。

在那里,war 和 jar 在同一个耳朵里,所以你只需要使用 Local 注释。

提示:由于不需要 EJB 3.1 接口,您可以直接在“Test”类上使用 @LocalBean 并删除 TestLocal 接口。

要将 ejb 方法调用到作为您的 war 的类中,您首先必须在 war 和 jar 之间创建一个链接。在同一个耳朵里是不够的。如果您使用 Maven,您可以简单地将 jar 引用添加到您的 pom 中的依赖项中。

于 2013-11-15T11:32:25.873 回答