@Stateless vs @RequestScoped
Je suis en train d'apprendre à utiliser de JAX-RS pour certaines api restful de développement et avez un problème concernant ma ressource classes.
Ma compréhension est que ma classe de ressource doit être RequestScoped, cependant,
quand il est RequestScoped mon appel à l'entité gestionnaire de l'persistent méthode il jette à un TransactionRequiredException.
Si je change de classe de ressource d'être Apatrides alors tout va bien et le gestionnaire de l'entité peut persister sans aucun problème.
Je suis encore nouveau pour JavaEE et voudrais savoir pourquoi cela se produit et ce que l' @Stateless annotation n'a que permet le contexte de persistance à injecter correctement.
Je voudrais aussi savoir si il ya un problème avec JAX-RS ressource classes apatrides au lieu de RequestScoped comme la plupart des tutos que j'ai vu ont leur.
J'ai inclus quelques exemple de code ci-dessous pour illustrer.
@Path("Things")
//@Stateless //works just fine when em.persist() is called
@RequestScoped //throws transactionrequiredexception when em.persist() is called
public class ThingsResource{
@PersistenceContext(unitName = "persistenceUnitName")
EntityManager em;
public ThingsResource() { }
@POST
@Produces(MediaType.APPLICATION_JSON)
public Response postThing(ThingDTO thing){
ThingEntity newThing = new ThingEntity(thing);
em.persist(newThing);
em.flush();
return Response.created(new URI("/" + newThing.getId()).build();
}
}
source d'informationauteur Bltucker | 2013-12-13
Vous devez vous connecter pour publier un commentaire.
Matthias est sur place.
Un @Stateless annoté bean est un EJB qui, par défaut, fournit Container-Managed-Transactions. CMT, par défaut, créer une nouvelle transaction si le client de l'EJB n'a pas en fournir un.
Dans la récente de java-ee-7 tuturial sur jax-rs, Oracle a exemple de l'utilisation des Ejb (@Stateless).
Principale différence entre @RequestScoped vs @Stateless dans ce scénario, le récipient peut mettre les EJBs et éviter certains cher construire/détruire des opérations qui pourraient être nécessaires pour les haricots qui autrement seraient construits sur chaque demande.
Lorsque vous ne voulez pas faire de votre racine de ressources comme un EJB (en annotant avec
@Stateless
), vous pouvez utiliser unUserTransaction
.