Verwendung von CDI + WS / RS + JPA eine Anwendung erstellen
Frage
@Path(value = "/user")
@Stateless
public class UserService {
@Inject
private UserManager manager;
@Path(value = "/create")
@GET
@Produces(value = MediaType.TEXT_PLAIN)
public String doCreate(@QueryParam(value = "name") String name) {
manager.createUser(name);
return "OK";
}
}
Hier ist der Benutzer-Manager impl
public class UserManager {
@PersistenceContext(unitName = "shop")
private EntityManager em;
public void createUser(String name) {
User user = new User();
user.setName(name);
// skip some more initializations
em.persist(user);
}
}
das Problem ist, wenn ich nicht markieren Userservice als @Stateless dann der Manager Feld null ist
aber wenn ich @Stateless markieren, kann ich der Manager Feld injiziert haben, und die Anwendung funktioniert, wie ich die Daten in db
gerettet werden könnenfrage mich, was ist der Grund dahinter?
und dies ist die bevorzugte Art und Weise der Anwendung der Verdrahtung?
Nun, ich denke, die EntityManager an einen Hersteller zu ziehen, so dass sie gemeinsam genutzt werden kann
Lösung
das Problem ist, wenn ich markieren Userservice nicht als @Stateless dann der Manager Feld null ist
Für die Injektion stattfindet, hat die Klasse a sein verwaltete Komponente wie Enterprise Beans, Servlets, Filter, JSF verwaltet Bohnen, etc oder CDI Managed Bean (dies der neue Teil ist mit Java EE 6, können Sie jede Klasse machen eine Managed Bean mit CDI).
Also, wenn Sie nicht über Ihre machen JAX-RS ein EJB-Endpunkt, wie Injektion ermöglichen? Dies erklärt sich schön in JAX-RS und CDI Integration mit Glassfish v3 :
Es gibt zwei Möglichkeiten CDI Managed Beans aktiviert sind:
instanziiert von CDI, Lebenszyklus verwaltet von Jersey. Beschriften mit
@ManagedBean
und optional annotate mit einem Jersey Umfang Anmerkung.instanziiert und verwaltet von CDI. Beschriften mit einer CDI Umfang Anmerkung, wie
@RequestScoped
(kein@ManagedBean
erforderlich)
Ich schlage vor, die Überprüfung auch die Ressourcen unten.
und dies ist die bevorzugte Art und Weise der Anwendung der Verdrahtung?
würde ich ja sagen. CDI ist sehr schön und ... Sie nicht wie Injektion?
na ja, ich denke die EntityManager an einen Hersteller zu ziehen, so dass sie gemeinsam genutzt werden kann
Shared zwischen was? Und warum? In Ihrem Fall sollten Sie eine EntityManager
mit einer Lebensdauer verwenden, die auf eine einzelne Transaktion (eine transaktionsbezogene Persistenzkontext ) scoped ist. Mit anderen Worten, es nicht teilen (und keine Sorge über das Öffnen und Schließen es für jede Anforderung, dies ist nicht eine teuere Operation).
Referenzen
- JPA 2.0 Spezifikation
- Kapitel 7.6 "Container-Managed Persistence Contexts"
- Abschnitt 7.6.1 "Container-Managed Transaction-scoped Persistence Context"
- Abschnitt 7.6.2 "Container-Managed Persistence Erweiterte Kontext"
Ressourcen
Andere Tipps
Die @Singleton Anmerkung helfen: http://www.mentby.com/paul-sandoz/jax-rs-on-glassfish-31-ejb-injection.html