2
私は、以下のように、プレーンJava SE 8プログラムでWeld 3.0.0のfinal(クラスパスで完全なweld-se-shaded.jar)でCDI 2.0を使用しています。 @Injectは何もしないので、何かが間違っていたり、何かが欠けています。つまり、参照はnullのままですか?図のようにプログラムによるアクセスが可能です。@Injectは、Java SEを使用してWeld 3でnullを返します
これをJBoss/Weld Jiraバグ追跡システムに投稿すると考えました。ただし、登録とログイン後、新しいエントリを作成するボタンが見つかりません。あなたの助けのための
おかげで、
StartUp.java
import javax.enterprise.inject.se.SeContainer;
import javax.enterprise.inject.se.SeContainerInitializer;
public class StartUp {
public static void main(String[] args) {
// start CDI Container
SeContainerInitializer initializer = SeContainerInitializer.newInstance();
try (SeContainer container = initializer.initialize()) {
Test t = new Test();
// start tests
t.test(container);
}
}
}
Test.java
import javax.enterprise.event.Event;
import javax.enterprise.inject.se.SeContainer;
import javax.enterprise.inject.spi.CDI;
import javax.inject.Inject;
public class Test {
@Inject
// IMyBean myBean; // does not work
MyBean myBean; // does not work
@Inject
Event<UserEvent> event; // does not work
public void test(SeContainer container) {
myBean.greete("World"); // NullPointerException
// manual lookup
// MyBean myBean2 = container.select(MyBean.class).get();
IMyBean myBean2 = CDI.current().select(IMyBean.class).get();
myBean2.greete("World");
event.fire(new UserEvent("info")); // NullPointerException
}
}
MyBean.java
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Named;
@Named
@ApplicationScoped
public class MyBean implements IMyBean {
public void greete(String s) {
System.out.println("Hello, " + s + "!");
}
}
SyncEventObserver.java
import javax.enterprise.event.Observes;
public class SyncEventObserver {
public void observeUserEvent(@Observes UserEvent userEvent) {
System.out.println("Received event:" + userEvent.getMessage());
}
}
UserEvent.java
public class UserEvent {
private String message;
public UserEvent() {
}
public UserEvent(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
}
META-INF/beans.xmlの
<beans version="2.0" bean-discovery-mode="all"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/beans_2_0.xsd">
</beans>
IMyBean.java
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Named;
@Named
@ApplicationScoped
public interface IMyBean {
void greete(String s);
}
うわー、ありがとうジョン。それがトリックでした。しかし、私にとっては、一度自己インスタンス化すると、CDIが切り捨てられるというかなり強い制限のようです。 – chris21k
あなたはどういう意味が分かりませんか?それは依存性注入の全体のポイントです。あなたはクラスのライフサイクルを管理していません。 –