从公开的RESTeasy接口访问@Local Session Bean

时间:2011-04-28 05:11:03

标签: ejb resteasy

我想要做的事情应该是非常直接但到目前为止是不可能的。有人能告诉我如何从暴露的RESTeasy界面访问@Local会话Bean吗?我已经浏览了互联网的长度和广度,我所能找到的只是同一个例子的变体

我试图找出如何使用RESTeasy以正常方式访问会话bean。这就是目前的情况:

使用:

  

EJB 3

     

RESTeasy 2.1

PUBLISHED EJB INTERFACE:

@Local
@Path("RequestReport")
public interface EReport {

     @GET
     @Produces({"application/xml"})
     @Path("request")
     public String requestReport(@QueryParam("reportId") @DefaultValue("") String reportId,
                                 @QueryParam("reportName") @DefaultValue("") String reportName, 
                                 @QueryParam("reportType") @DefaultValue("") String reportType);

     }
}

BEAN 1:

@Stateless
public class EReportRequest implements EReport {      

     @EJB 
     private ReplyStringLocal replyString; // THIS IS WHERE THE PROBLEM LIES.

     public String requestReport(@QueryParam("reportId") @DefaultValue("") String reportId,
                                 @QueryParam("reportName") @DefaultValue("") String reportName, 
                                 @QueryParam("reportType") @DefaultValue("") String reportType) {     

          return replyString.getReply(reportId, reportName, reportType);        

    }
}

未发布的EJB接口:

@Local
public interface ReplyStringLocal { 

     public String getReply(String reportId, String reportName, String reportType);

}

BEAN 2:

@Stateless
public class ReplyString implements ReplyStringLocal { 

     public String getReply(String reportId, String reportName, String reportType) {

          return "<response><reportId>" + reportId + "</reportId><reportName>" + reportName +
                 "</reportName><reportType>" + reportType + "</reportType></response>";
      } 
}

为了演示我的问题,这个例子是超级简化的。提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

For:JBoss 5,RESTeasy 2.1和EJB 3。

好的,所以我终于得到了有关RESTeasy的EJB的完整故事。所以这就是:

  

:一种。您可以通过为RESTeasy路径注释和EJB会话bean注释发布具有RESTful接口的会话bean。

INTERFACE:

@Local
@Path("MessageMaker")
public interface MessageMakerLocal {

    @GET
    @Produces({"application/xml"})
    @Path("getMessage")
    public String getMessage(@QueryParam("message") @DefaultValue("") String message);

}

实现:

@Stateless
public class MessageMakerImpl implements MessageMakerLocal {

    public String getMessage(@QueryParam("message") @DefaultValue("") String message) {
        return "Your Message: " + message;
    }
}

  

<强> B中。您不能在RESTeasy中使用@EJB注释,因此使用来自已发布的POJO或已发布的EJB的@Local会话Bean引用是不可能的。因此,原始帖子中提供的示例无效。

  

<强>℃。要从已发布的POJO或已发布的会话Bean访问会话Bean,您可以使用@Remote接口注释和JAR您的Bean类。在构建EAR文件时,将JAR添加到EAR的根目录,并在META-INF / application.xml文件中添加对它的引用。

INTERFACE:

@Remote
public interface MessageMakerRemote {

    public String getMessage(@QueryParam("message") @DefaultValue("") String message);

    }
}

实现:

@Stateless
@RemoteBinding(jndiBinding = "MessageMakerRemote")
public class MessageMakerImpl implements MessageMakerRemote {

    public String getMessage(String message) {
        return "Your Message: " + message;
    }
}

在Application.xml中:

<module>
    <java>MessageMaker.jar</java>
</module>

然后,您可以使用对jar的JNDI远程调用来引用它:

@Local
@Path("Message")
public class Message {

    @GET
    @Path("requestMessage")
    public String requestMessage(@QueryParam("msg") @DefaultValue("") String msg){

        // I use a custom JNDI remote call handler class so my call to the JARed beans looks like this:
        return JNDIRemote.getRemote(com.message.ejb3.MessageMakerRemote.class).getMessage(msg);
    }
}

我希望RESTeasy的更高版本能够更好地集成EJB。