我有一个 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,每当有人请求注入Bar的实例时,它应该使用标记为@Inject的构造函数。

然后CDI容器尝试获取所有必需构造函数参数的实例并失败,因为它无法处理"字符串"。它只是不知道你的意思是哪个字符串。

你必须通过使用生产者和限定符来帮助容器解决依赖关系,告诉他你想要什么字符串。我只是在这里给你最简单的解决方案:

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"对象。字符串不是一个托管对象,因此这是行不通的.

但是,下面的例子应该工作(我在这里使用了spring。根据您正在使用的库使用DIALIZATON代码):

@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