uczę się korzystać z JAX-RS jakiegoś spokojnego rozwoju API i mieć problem odnośnie klas moich zasobów.@Stateless vs @RequestScoped
Rozumiem, że moja klasa zasobów powinna być RequestScoped, jednak , gdy jest RequestScoped moje wezwanie do metody trwałej menedżera encji, wyrzuca wyjątek TransactionRequiredException.
Jeśli zmienię moją klasę zasobów być Stateless wtedy wszystko jest w porządku i kierownik podmiotu może utrzymywać się bez problemu.
wciąż jestem nowy na JavaEE i chcieliby wiedzieć, dlaczego tak się dzieje i co robi @Stateless adnotacji, który pozwala kontekst wytrwałość wstrzyknąć poprawnie. Chciałbym również wiedzieć, czy istnieje jakiś problem z klasami zasobów JAX-RS będącymi bezstanowymi, zamiast z RequestScoped, ponieważ większość samouczków, które widziałem, ma je.
I zawierały przykładzie poniżej dla zilustrowania.
@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();
}
}
myślę, że jeśli masz Stateless Bean i dont używać Adnotacje np transakcyjne (wymagane) Twój ApplicationServer zamierza stosować w oparciu transakcja na jego EJB. Zażądaj Scoped Beans znajdują się w Servlet Container, który nie zapewnia transakcji opartych na kontenerach (myślę). –