2017-08-02 59 views
2

我在一個簡單的Java SE 8程序中使用CDI 2.0和Weld 3.0.0 final(類路徑中完整的weld-se-shaded.jar),如下所示。它有什麼問題或者我錯過了什麼,因爲@Inject什麼也不做,即引用保持爲空?程序化訪問如圖所示。@Inject在Weld 3中使用Java SE提供null

我以爲把它發佈到JBoss/Weld Jira Bug跟蹤系統中。但是,在註冊和登錄後,我無法找到用於創建新條目的按鈕。

感謝您的幫助,

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。

+0

哇,謝謝約翰。那就是訣竅。然而,對我來說,似乎是一個相當強大的限制,一旦自我實例化,CDI被切斷。 – chris21k

+0

我不確定你的意思?這就是依賴注入的重點,你不管理你的類的生命週期。 –

相關問題