2017-08-02 10 views
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); 

} 

答えて

0

あなたの主な方法は次のようになります。

public static void main(String[] args) { 
    // start CDI Container 
    SeContainerInitializer initializer = SeContainerInitializer.newInstance();   
    try (SeContainer container = initializer.initialize()) { 
     Test t = container.select(Test.class).get(); 

     // start tests 
     t.test(container); 
    } 
} 

あなたのテストクラスに注入ポイントがありますが、それをインスタンス化するのは、理由です。これにより、CDIはあなたのBeanを管理できなくなります。

+0

うわー、ありがとうジョン。それがトリックでした。しかし、私にとっては、一度自己インスタンス化すると、CDIが切り捨てられるというかなり強い制限のようです。 – chris21k

+0

あなたはどういう意味が分かりませんか?それは依存性注入の全体のポイントです。あなたはクラスのライフサイクルを管理していません。 –

関連する問題