Доступ к @Local Session Bean из открытого интерфейса RESTeasy - PullRequest
2 голосов
/ 28 апреля 2011

То, что я пытаюсь сделать, должно быть очень прямым, НО до сих пор было невозможно.Может кто-нибудь сказать мне, как получить доступ к @Local Session Bean из открытого интерфейса RESTeasy?Я просмотрел длину и ширину интернета, и все, что я могу найти, - это варианты одного и того же примера

Я пытаюсь выяснить, как я могу получить доступ к сессионному компоненту обычным способом с помощью RESTeasy.Вот как это выглядит на данный момент:

ИСПОЛЬЗОВАНИЕ:

EJB 3

RESTeasy 2.1

ПУБЛИКОВАННЫЙ ИНТЕРФЕЙС EJB:

@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 Ответ

1 голос
/ 29 апреля 2011

Для: JBoss 5, RESTeasy 2.1 и EJB 3.

Хорошо, так что я наконец-то получил полную историю об EJB с помощью RESTeasy.Итак, вот оно:

A.Вы можете опубликовать компонент Session с интерфейсом RESTful, предоставив ему аннотацию пути RESTeasy и примечание EJB Session bean.

ИНТЕРФЕЙС:

@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.Вы не можете использовать аннотацию @EJB в RESTeasy, поэтому об использовании ссылки на bean-компонент @Local Session из опубликованного POJO или опубликованного EJB не может быть и речи.Таким образом, приведенный в исходном сообщении пример недействителен.

.

C.Чтобы получить доступ к Session Bean из опубликованных POJO или опубликованных Session 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>

Вызатем можно сослаться на него с помощью удаленного вызова JNDI на ваш jar:

@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.

...