سؤال

@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:

  1. من قبل CDI ، دورة الحياة التي يديرها جيرسي. التعليقات مع @ManagedBean وتوضيح اختياريا مع شرح نطاق القميص.

  2. تم إنشاءه وإدارته بواسطة 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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top