从同一EAR内的WAR调用EJB

时间:2013-11-15 11:20:52

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

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

首先:

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

2 个答案:

答案 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)

例如,如果您将包含EJB的jar分别部署在不同的服务器上,则@Remote非常有用。

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

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

要将ejb方法调用到您的战争类中,首先必须在war和jar之间创建一个链接。处于同一个耳朵是不够的。 如果您使用Maven,您只需将jar引用添加到战争中的依赖项中即可。