मैं कुछ आरामपूर्ण एपीआई विकास के लिए जेएक्स-आरएस का उपयोग करना सीख रहा हूं और मेरे संसाधन वर्गों के बारे में कोई समस्या है।@ स्टेटलेस बनाम @RequestScoped
मेरी समझ यह है कि मेरा संसाधन वर्ग अनुरोध किया जाना चाहिए, हालांकि, अनुरोध है जब यह अनुरोध है कि इकाई प्रबंधक के बने रहने के तरीके पर मेरा कॉल ट्रांसपेक्शन रिवार्ड अपवाद फेंकता है।
यदि मैं अपनी संसाधन कक्षा को स्टेटलेस बनने के लिए बदलता हूं तो सब ठीक है और इकाई प्रबंधक किसी भी मुद्दे के बिना जारी रह सकता है।
मैं अभी भी जावाईई के लिए नया हूं और यह जानना चाहता हूं कि ऐसा क्यों होता है और @ स्टेटलेस एनोटेशन क्या करता है जो दृढ़ता संदर्भ को सही ढंग से इंजेक्ट करने की अनुमति देता है। मैं यह भी जानना चाहूंगा कि जेएक्स-आरएस संसाधन वर्गों के साथ RequestScoped की बजाय स्टेटलेस होने में कोई समस्या है या नहीं, क्योंकि मैंने देखा है कि अधिकांश ट्यूटोरियल हैं।
मैंने चित्रण के लिए नीचे कुछ उदाहरण कोड शामिल किया है।
@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();
}
}
मुझे लगता है कि अगर आप एक स्टेटलेस बीन है और आप लेन-देन एनोटेशन, उदा (आवश्यक) का उपयोग नहीं है, अपने Applicationserver अपने EJBs के लिए कंटेनर आधारित लेन-देन का उपयोग करने के लिए जा रहा है। अनुरोध स्कोप्ड बीन्स सर्वलेट कंटेनर के भीतर हैं जो कंटेनर आधारित लेनदेन प्रदान नहीं करता है (मुझे लगता है) –