我的 EJB 如下:
public class Bar() {
private String s;
public Bar() {
this.s = "bar";
}
@Inject public Bar(String s) {
this.s = s;
}
}
如何通过将 arg-constructor 引入另一个Foo
类来注入该bean?
然后,我将Foo
类定义为EJB,目的是将 DI 执行到另一个类(例如,WebServlet)。如何通过将Foo
传递给正确设置String
arg-constructor作为内部依赖来注入Bar
类实例?
有没有更好的方法来定义Bar
以达到上述要点?
答案 0 :(得分:1)
带注释的构造函数注入告诉CDI,每当有人请求注入Bar实例时,它应该使用标有@Inject的构造函数。
然后,CDI容器尝试获取所有必需构造函数参数的实例并失败,因为它无法处理“String”。它只是不知道你指的是哪个字符串。
您必须通过使用Producer和限定符来帮助容器解析依赖关系,以告诉他您想要的String。我在这里给你最简单的解决方案:
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 ...
}
}
答案 1 :(得分:0)
@Inject
仅在您注射" managed
"对象。字符串不是托管对象,因此无法工作。
但是,以下示例应该可行(我在这里使用了spring。根据您使用的库使用DI初始化代码):
@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;
}
}