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önnen

frage 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

War es hilfreich?

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:

  1. instanziiert von CDI, Lebenszyklus verwaltet von Jersey. Beschriften mit @ManagedBean und optional annotate mit einem Jersey Umfang Anmerkung.

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top