【问题标题】:Calling EJB from a WAR inside the same EAR从同一 EAR 中的 WAR 调用 EJB
【发布时间】:2013-11-15 11:20:52
【问题描述】:

我正在使用 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 中的本地接口吗?
  • 如果是这样,那么有人知道我做错了什么吗?我需要设置某种安全配置吗?

【问题讨论】:

  • 您的 EJB 是否有任何安全配置设置?

标签: java jakarta-ee glassfish ejb ejb-3.0


【解决方案1】:

要查找远程 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。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 我认为这并不完全正确。如果 EJB jar 是 EAR 的一个模块,那么它的所有类都可用于 WAR。添加对 POM 的引用(使用 <scope>compile</scope>)会将 EJB jar 添加到 WAR/WEB-INF/lib 文件夹中,如果 EJB jar 已经是 EAR 的模块,则不需要这样做。
    猜你喜欢
    • 1970-01-01
    • 2017-08-27
    • 2011-10-21
    • 1970-01-01
    • 2011-05-25
    • 2023-03-22
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    相关资源
    最近更新 更多