2016-05-19 11 views
0

Ich habe ein Problem herauszufinden, wie JAX-RS 2.0 mit CDI auf Wildfly 10 arbeiten. Ich bekam eine Antwort auf eine andere post das war eine Mischung aus JAX-RS 1.0/2.0 und sie verwendeten andere Abhängigkeiten als die enthaltenen Bibliotheken in Wildfly.Wie man @Inject und CDI für Enterprise-Beans mit JAX-RS 2.0 (Resteasy) verwendet

Mein Ziel ist es, eine Singleton-Enterprise-Bean zu injizieren, die Geschäftslogik, die sich im selben Jar befindet, in meine REST-Ressource einkapseln. Die REST-Ressourcenklasse soll ein Anforderungsbereich sein und sich nur mit der REST-Funktionalität (Anfrage und Antwort) befassen. Meine POJO-Klassen sind JAXB notiert.

Wie kann ich JAX-RS 2.0 mit den enthaltenen CDI-Bibliotheken in Wildfly 10 verwenden?

Die bean Schnittstelle

@Local 
public interface DateBean { 
    Date getLocalFormatDate(); 
} 

Die bean

@Singleton 
public class DateBeanImpl implements DateBeanLocal { 

    private static final Logger LOG = Logger.getLogger("org.test.logger"); 

    public DateBean() { 
     LOG.fine("DateBean"); 
    } 

    @Override 
    public Date getLocalFormatDate() { 
     Calendar cal = Calendar.getInstance(); 
     TimeZone localZone = TimeZone.getDefault(); 
     cal.setTimeZone(localZone); 
     Date localTime = cal.getTime(); 
     return localTime; 
    } 
} 

Die REST-Ressource

@Path("classroom") 
@Consumes({MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN}) 
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) 
public class ClassRoomResource { 

    private static final Logger LOG = Logger.getLogger("org.clearbyte.logger"); 
    @Inject private DateBean dateBean; 

    public ClassRoomResource() { 
     LOG.fine("ClassRoomResource"); 
    } 

    @GET 
    @Path("{id}/getDummy") 
    public ClassRoom getDummy(@PathParam("id") long id) { 
     ClassRoom room = new ClassRoom(); 
     room.setRoomName("Dummy"); 
     room.setRoomNr(id); 
     return room; 
    } 

    @GET 
    @Path("localDate") 
    @Produces({MediaType.TEXT_HTML}) 
    public Response getLocalformatDate() { 
     LOG.fine("DateBean variable: " +dateBean); 
     Date localDate = dateBean.getLocalDate(); 
     LOG.fine("Local date: " +localDate); 
     return Response.status(Response.Status.OK) 
       .entity(localDate.toString()) 
       .build(); 
    }   
} 
+0

Ich verstehe den Punkt dieser Frage nicht. JAX-RS unterstützt CDI out-of-the-box. –

+0

Ich verstehe Ihren Standpunkt auch nicht. Um eine JAX-RS-Ressource in einem Java EE 7-Container zu aktivieren, müssen Sie nur JAX-RS-Annotationen (je nach Java EE-Spezifikation für Beispiel in Ihren Abhängigkeiten) verwenden und dann injizieren, was Sie injizieren möchten (Session-Beans, verwaltet) Bohnen, ...) mit CDI. Keine Notwendigkeit, sich auf Resteasy-Bibliotheken zu verlassen (außer, wenn Sie Resteasy-spezifische Funktionen verwenden) –

+0

Wahr, die Abhängigkeiten für JAX-RS 2.0 müssen nicht hinzugefügt werden. Bearbeitete die Antwort. – Chris

Antwort

0

Die Resteasy Umsetzung JAX-RS 2.0 in Wildlfy 10 enthalten sind, so dass es keine Notwendigkeit, weitere Abhängigkeiten hinzuzufügen.

Die Schnittstelle benötigt @Local nicht, wenn sie sich im selben Jar/Krieg befindet, damit CDI sie findet. Um das Enterprise-Beans-Singleton in CDI mit @ApplicationScope zu versehen, können Sie die @ Singleton-Schreibweise weglassen, wenn Sie keine Managed Bean mit Lese-/Schreib-Synchronisation benötigen.

Die REST-Ressourcenanforderung im Bereich verwenden verwenden Sie die Notation @RequestScoped. Beachten Sie, dass die @Inject die Schnittstelle injizieren und nicht die Implementierung der Bean.

@RequestScoped 
@Path("classroom") 
@Consumes({MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN}) 
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) 
public class ClassRoomResource { 

    private static final Logger LOG = Logger.getLogger("org.clearbyte.logger"); 
    @Inject private DateBean dateBean; 
    ... 

Keine Konfiguration des web.xml ist notwendig, wenn Sie eine der Anwendungsklasse JAX-RS-verlängern.

@ApplicationPath("rest") 
public class ClassRoomApp extends Application { 

private final Set<Class<?>> resources = new HashSet<>(); 

    public ClassRoomApp() { 
     resources.add(ClassRoomResource.class); 
    } 

    @Override 
    public Set<Class<?>> getClasses() { 
     return resources; 
    } 
}