0

我正在尝试用 Java 开发一个使用 EJB 的简单 Web 服务,EJB 在 jar 文件中,WebServices 在 war 文件中,两者都打包在一只耳朵里。我们在 JBOSS-AS 7.1 上使用 EjB 3.0。

这是我的 EJB 类及其接口:

@Stateless
public class TestEjb implements ITestEjb {

    public boolean authentifier(String login, String password) {
        if(login.equals("nico") && password.equals("nr"))
            return true;
        else 
            return false;
    }

}

@Local
public interface ITestEjb {
    public boolean authentifier(String login, String password);
}

这是我的Web 服务,它注入了以前的 EJB

//@Stateless
@WebService
@SOAPBinding(style = Style.RPC)
public class AuthentificationWS {
    @EJB
    private ITestEjb testEjb;

   public boolean authentifier(String login,String password) {
       return testEjb.authentifier(login, password);
   }
}

部署运行良好,但是当我调用我的 Web 服务时,EJB 始终为
(error : java.nullpointerException).

因此,我尝试将一个添加@Stateless到我的 Web 服务以将其转换为 EJB,但是当我尝试通过 Web 服务客户端使用它时没有成功。

然后我尝试通过本地 jndi 查找访问 Ejb,如下所示,在 JBOSS 日志中获取本地 jndi url:

final String jndi = "java:module/TestEjb!fr.test.ITestEjb";
testEjb = (ITestEjb) new InitialContext().lookup(jndi);

但它没有用。

最后我尝试使用如下的全局 jndi url

final String jndi = "ejb:Num-ear-1.0.0-SNAPSHOT/Num-ejb-1/TestEjb!fr.test.ITestEjb"
testEjb = (ITestEjb) new InitialContext().lookup(jndi);

而且效果很好!!

所以,我不明白为什么我的 web 服务无法通过注入或本地 Jndi 方式本地访问其 EJB?

4

3 回答 3

3

原因是在 JBOSS-AS 7.1 中,ejb 服务的部署和映射方式不同。如果您没有为无状态 bean 指定映射名称,则必须使用其全局名称进行查找,如下所示:ejb:Num-ear-1.0.0-SNAPSHOT/Num-ejb-1/TestEjb!fr.test .ITestEjb

您可以尝试通过以下方式添加映射名称:

@Stateless(name = "ejb/ar/TestEjb", mappedName = "ejb/ar/TestEjb")
public class TestEjb implements ITestEjb {

在您的网络服务中:

@EJB(name = "ejb/ar/TestEjb", mappedName = "ejb/ar/TestEjb")
private ITestEjb testEjb;

在你的 web.xml 中:

<ejb-local-ref>
    <ejb-ref-name>ejb/ar/TestEjb</ejb-ref-name>
    <ejb-ref-type>Session</ejb-ref-type>
    <local>yourpackage.TestEjb</local>
</ejb-local-ref>

在这种情况下,我假设您将 web 服务部署为 web 模块。有关如何将 Web 服务部署为 Web 模块的参考,请查看此链接:http ://www.mkyong.com/webservices/jax-ws/deploy-jax-ws-web-services-on-tomcat/

于 2013-01-14T14:28:51.010 回答
1

我之前用过: new InitialContext().lookup(java:app/domain/TestService) 转换为ear并使用:

@Local
@Remote
public interface Test {}

@Stateless(name="Test", mapped-name="Test")
public TestService implements Test {}

@Webservice
public MyService{
     @EJB(name="Test", mapped-name="Test")
     private Test test;
}

这似乎可行,但需要在测试接口中设置@Remote ():)。Webservice 处于战争状态,域在 jar 中,两者都包含在 ear 中并部署在 Glassfish (3.1.2) 中。很遗憾我不得不使用注释@Remote,因为它都在同一个耳朵里。如果我省略 @Remote,我会在 Glassfish 中部署时出现异常:“尝试在 EJB 上设置 ejb-ref,而 EJB 未定义远程接口”。有没有办法省略 @Remote ?

于 2013-02-26T10:27:45.453 回答
-1

不带接口试试,EJB3.x中不再需要定义接口

@Stateless
public class TestEjb {

    public boolean authentifier(String login, String password) {
        if(login.equals("nico") && password.equals("nr"))
            return true;
        else 
            return false;
    }

}

然后注入web服务如下

@WebService
public class AuthentificationWS {
   @EJB
   private TestEjb testEjb;

   public boolean authentifier(String login,String password) {
       return testEjb.authentifier(login, password);
   }
}
于 2012-07-21T06:47:25.093 回答