2012-03-27 4 views
8

Ich entdeckte eine neue Funktion in Java erholsam bei der Verwendung von EJB 3.1 beim Lesen eines Artikels bei Adam Bien's Blog.Wie kann ein EJB 3.1 als REST-Webdienst verfügbar gemacht werden?

Die Sache ist, dass Staatenlose und Singleton Bohnen als Root-Ressourcen ausgesetzt werden können. Aber wie? Ich habe versucht, es so zu tun:

@Stateless 
@LocalBean 
@Path("Hybrid") 
public class RESTEJBSample { 

    @GET 
    @Path("/demo") 
    @Produces(MediaType.TEXT_PLAIN) 
    public String something() { 
     return "I am a Hybrid!!!"; 
    } 

} 

Wenn ich rufen Sie die URL http://localhost:8080/HybridSample/resources/Hybrid/demo ich erhalte einen 404-Fehler.

Appart davon und nur um sicherzustellen, dass JAXRS in meinem Projekt funktioniert, habe ich eine einfache pojo-Ressource erstellt, nur um zu testen, ob es gut funktioniert. Hier

@Path("/genericresource") 
public class GenericResource { 
    @GET 
    @Path("/samplemethod") 
    @Produces(MediaType.TEXT_PLAIN) 
    public String saySomething() { 
     return "Something!"; 
    } 
} 

wenn ich rufen Sie die URL http://localhost:8080/HybridSample/resources/genericresource/samplemethod Es funktioniert gut!

Also meine Fragen sind:

  • , was in meinem EJB fehlt, so kann es als Web-Service-Ressourcen arbeiten wie die Klasse GenericResource tut?

  • Ist eine zusätzliche Konfiguration erforderlich?

  • Welche Einschränkungen bestehen bei der Verwendung von EJB als Webdienst?

Antwort

11

Nach dieser NetBeans tutorial about Jersey RESTFul web services, können Sie entscheiden, ob sie

eine Unterklasse von javax.ws.rs.core.Application schaffen, alle Rast Ressourcen wird von dieser Klasse nicht registriert werden automatisch (Java EE 6)

oder

erstellen Standard Jers ey REST-Servletadapter in web.xml.

Ich habe früher immer die zweite Wahl, die in dem Hinzufügen dieser zu Ihrem web.xml besteht:

<servlet> 
    <servlet-name>ServletAdaptor</servlet-name> 
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>ServletAdaptor</servlet-name> 
    <url-pattern>/resources/*</url-pattern> 
</servlet-mapping> 

Ihren REST Web Service als ein Offenlegen von EJB ist, meine Erfahrung sehr nützlich. Sie können es injizieren, wo Sie möchten, Sie können darin Ihren EntityManager einfügen, und Sie können es sogar als ein DAO in einigen einfachen Situationen verwenden.

Bezüglich Ihrer Frage/Anmerkung zu Funktionen und Einschränkungen: Enterprise-Beans werden im EJB-Container ausgeführt, unabhängig davon, ob sie in einer WAR-Datei implementiert sind oder nicht. Sie können ihnen eine JMS ConnectionFactory als Ressource hinzufügen, wie in this section des Java EE 6 Tutorials beschrieben. Dank der Injektion einer ConnectionFactory können Sie JMS-Nachrichten senden. Wenn Sie JMS-Nachrichten asynchron empfangen möchten, müssen Sie eine Message-Driven Bean definieren, wie in this section des oben genannten Lernprogramms erläutert. Ich habe noch nie versucht, das gleiche EJB für einen Jersey Web-Service zu erweitern, um die MessageListener-Schnittstelle zu implementieren, aber ich denke, dass sollte auch möglich sein (wenn nicht, können Sie eine MDB in Ihre Jersey-Wurzel Stateless Bohne injizieren) .

Schließlich können Sie Container-Managed-Transaktionen wie erläutert here verwenden. Darüber hinaus ist aus this NetBeans tutorial:

Um Ihnen zu haben, kann sehen, dass die Anwendung die Java Transaction API verwenden (JTA) (transaktions type = "JTA"). Dies gibt an, dass die Verantwortung für die Verwaltung des Lebenszyklus von Entitäten im Persistenzkontext dem Container zugewiesen ist.

<persistence-unit name="em" transaction-type="JTA"> 
+0

Gut ich habe nicht das erste wissen :) Die web.xml Option ist auch mein favoutity, mein derzeitiger web.xml lookl wie das schon. Ich habe auch die Netbeans-IDE 'New-> Webservice' verwendet und nach einem Assistenten habe ich eine Option gewählt, die besagt, dass ich den Web-Service als Stateless-Bean erstellen soll. Das eingefügt fügt die EJB in die WAR-Datei und jetzt funktioniert es gut. Mein Beispiel funktioniert jetzt gut, aber ich wäre auch interessiert zu wissen, was hinter der Szene passiert ?, welche Dateien werden von Net Beans bearbeitet? Und was sind die Grenzen dieser Bohne? Ja, ich denke, das ist auch eine wirklich coole Funktion. – sfrj

+0

NetBeans fügt nichts hinzu: Die einzigen Dinge, die Sie tun müssen, sind die Stateless-Klasse (RESTEJBSample in Ihrem Beispiel) und der Servlet-Adapter in web.xml zu erstellen. Das Servlet macht die ganze Magie hinter den Kulissen. In Bezug auf die Einschränkungen denke ich, dass Sie versuchen sollten, Ihre Frage ein wenig zu klären. – perissf

+0

Wenn ich Einschränkungen meine, meine ich. Sind diese Beans in der Lage, sich so zu verhalten wie in den EJB-Modulen? Was ich meine ist, gibt es irgendeine Notwendigkeit für eine Art von manueller Transaktionsverwaltung? Können sie mit JMS interagieren? ... Jetzt sind sie nicht im EJB-Container, sie sind in einer WAR-Datei. – sfrj

Verwandte Themen