باستخدام CDI + WS/RS + JPA لإنشاء تطبيق
سؤال
@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";
}
}
هنا هو مدير المستخدم
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);
}
}
المشكلة هي أنه إذا لم أميز UserService كـ stateless ، فسيكون حقل المدير فارغًا
ولكن إذا قمت بتحديد علامة stateless ، فيمكنني حقن حقل المدير ، ويعمل التطبيق حيث يمكنني الحصول على البيانات في DB
فقط أتساءل ، ما هو السبب وراء هذا؟
وهل هذه هي الطريقة المفضلة لتسجيل التطبيق؟
حسنًا ، أنا أفكر في سحب ContityManager إلى منتج ، بحيث يمكن مشاركته
المحلول
المشكلة هي أنه إذا لم أميز UserService كـ stateless ، فسيكون حقل المدير فارغًا
لحدوث الحقن ، يجب أن يكون الفصل مكون مُدار مثل حبوب المؤسسة ، servlets ، المرشحات ، الفاصوليا المدارة JSF ، إلخ أو CDI المدير الفول (هذا هو الجزء الجديد مع Java EE 6 ، يمكنك جعل أي فول من الفئة A مع CDI).
لذا ، إذا لم تصنع نقطة نهاية Jax-RS الخاصة بك EJB ، فكيف لتمكين الحقن؟ تم شرح هذا بشكل جيد في Jax-RS و CDI تكامل باستخدام Glassfish V3:
هناك طريقتان يتم تمكين الفاصوليا المدارة CDI:
من قبل CDI ، دورة الحياة التي يديرها جيرسي. التعليقات مع
@ManagedBean
وتوضيح اختياريا مع شرح نطاق القميص.تم إنشاءه وإدارته بواسطة CDI. التعليقات مع شرح التوضيح نطاق CDI ، مثل
@RequestScoped
(رقم@ManagedBean
مطلوب)
أقترح أيضًا التحقق من الموارد أدناه.
وهل هذه هي الطريقة المفضلة لتسجيل التطبيق؟
سأقول نعم. CDI لطيف جدا و ... ألا تحب الحقن؟
حسنًا ، أنا أفكر في سحب ContityManager إلى منتج ، بحيث يمكن مشاركته
مشترك بين ماذا؟ و لماذا؟ في الحالة ، يجب عليك استخدام EntityManager
مع العمر الذي يتم تحديد النطاق في معاملة واحدة (أ سياق الثبات المعامل). بمعنى آخر ، لا تشاركه (ولا تقلق بشأن فتحه وإغلاقه لكل طلب ، هذه ليست عملية باهظة الثمن).
مراجع
- مواصفات JPA 2.0
- القسم 7.6 "سياقات الثبات التي تديرها الحاويات"
- القسم 7.6.1 "سياق الثبات الذي يديره الحاويات" سياق الثبات "
- القسم 7.6.2 "سياق الثبات الممتد الذي يديره الحاويات"
موارد
نصائح أخرى
ال Singleton سوف يساعد التعليق التوضيحي: http://www.mentby.com/paul-sandoz/jax-rs-on-glassfish-31-ejb injection.html