سؤال

لدي EJB على النحو التالي:

public class Bar() {

     private String s;

     public Bar() {
         this.s = "bar";
     }

     @Inject public Bar(String s) {
         this.s = s;
     }

}
  1. كيف يمكن حقن هذا الفول باستخدام arg-منشئ إلى آخر Foo الفصل ؟

  2. ثم ، تحديد Foo الفئة EJB ، بهدف تنفيذ دي بالنسبة إلى فئة أخرى (على سبيل المثال ، WebServlet).كيف يمكنني حقن Foo فئة سبيل المثال عن طريق تمرير String إلى إعداد بشكل صحيح Bar arg-منشئ كما الداخلية-التبعية?

  3. هل هناك طريقة أفضل لتحديد Bar من أجل تحقيق النقاط أعلاه ؟

هل كانت مفيدة؟

المحلول

المشروح حقن منشئ يقول CDI التي كلما شخص يطلب مثيل شريط ليتم حقنه ، فإنه يجب استخدام منشئ مع وضع علامة @Inject.

وأول هذه الحاوية ثم يحاول أن يحصل الحالات المطلوبة منشئ المعلمات فشل لأنه لا يمكن التعامل مع "السلسلة".أنها فقط لا تعرف السلسلة التي تعنيه.

لديك لمساعدة حاوية حل التبعية باستخدام منتج تصفيات أن أقول له ماذا سلسلة تريد.أنا فقط أعطيك أبسط الحلول الممكنة هنا:

public class Bar {

 @Inject 
 public Bar(@Named("myString") String s) {
     this.s = s;
 }
}

ثم في فصل آخر (لا يجب أن يكون فئة مختلفة ، ولكن أكثر من ذلك بكثير للقراءة):

public class MyStringProducer {
  @Produces
  @Named("myString")
  public String getMyString() {
    return ...; // whatever you want ... read JSON, parse properties, randomize ...
  }
}

نصائح أخرى

@Inject يعمل فقط عندما يتم حقن "managed"الكائنات.سلسلة لا تمكن الكائن ، وبالتالي هذا لن;ر العمل.

ومع ذلك ، فإن المثال التالي يجب أن تعمل (لقد استخدمت الربيع هنا.استخدام دي initializaton رمز وفقا المكتبة كنت تستخدم):

@Named
public class Foo {

    @Inject
    Bar bar;

    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext("com.pkg1");
        Foo foo = (Foo)ctx.getBean("foo");

        System.out.println(foo.bar.getString());

    }


}

@Named
public class Bar {
    private String s;
    public Bar() {
        this.s = "bar";
    }
   @Inject 
   public Bar(Bar1 bar1) {
        this.s = bar1.getS();
    }
    public String getString() {
        return s;
    }
}

@Named
class Bar1 {
    private String s="bar1";
    public String getS() {
        return s;
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top