2017-04-07 10 views
0

私はCDIの初心者の段階で午前と以下のようにフィールド注入を使用して、インタフェースの実装を注入しようとしている:コンテキストと依存性注入:インタフェースの実装を挿入する方法は?

AutoService.java

package com.interfaces; 

public interface AutoService { 
    void getService(); 
} 

BMWAutoService.java

package com.implementations; 

import javax.inject.Named; 

import com.interfaces.AutoService; 

@Named("bmwAutoService") 
public class BMWAutoService implements AutoService { 

    public BMWAutoService() { 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public void getService() { 
     System.out.println("You chose BMW auto service"); 

    } 

} 

AutoServiceCaller.java

package com.interfaces; 

public interface AutoServiceCaller { 
    void callAutoService(); 
} 

A私はTestDisplayMessage.javaを実行するとutoServiceCallerImp.java

package com.implementations; 

import javax.inject.Inject; 
import javax.inject.Named; 

import com.interfaces.AutoService; 
import com.interfaces.AutoServiceCaller; 

public class AutoServiceCallerImp implements AutoServiceCaller { 

    @Inject 
    @Named("bmwAutoService") 
    private AutoService bmwAutoService; 

    public AutoServiceCallerImp() { 

    } 

    @Override 
    public void callAutoService() { 
     bmwAutoService.getService(); 

    } 

} 

TestDisplayMessage.javaは

package com.tests; 

import com.implementations.AutoServiceCallerImp; 
import com.interfaces.AutoServiceCaller; 

public class TestDisplayMessage { 

    public TestDisplayMessage() { 
     // TODO Auto-generated constructor stub 
    } 

    public static void main(String[] args) { 

     AutoServiceCaller caller = new AutoServiceCallerImp(); 

     caller.callAutoService(); 

    } 

} 

、期待される結果は、 "あなたはBMWの自動車サービスを選択しました" が、私は以下のようにNullPointerExceptionを取得し、次のようになります。

Exception in thread "main" java.lang.NullPointerException 
    at com.implementations.AutoServiceCallerImp.callAutoService(AutoServiceCallerImp.java:21) 
    at com.tests.TestDisplayMessage.main(TestDisplayMessage.java:16) 

私はここで紛失しているものを正確に把握できませんでした。助けてください。あらかじめありがとうございます。

答えて

0

[OK]をクリックすると、CDIの概念が誤解されているように見えます。アイデアは、CDIコンテナにBeanのライフサイクルを任せることです。つまり、CDIはを作成してを作成します。言い換えれば、ではないは、newを呼び出してBeanを作成するはずです。あなたがそうするならば、CDIはそれについて知らず、何も注入しません。

あなたがmainのテスト方法を使用していると思われるSE環境にいる場合は、Weld(CDI実装)SEアーティファクトを使用したいと思います。 CDIコンテナを開始するにはが必要です。サーバーで古典的なEEアプリケーションを開発していた場合は、サーバーがそれを処理するため、これを行わないことに注意してください。さて、溶接SEコンテナを起動するための非常に基本的な方法は次のとおりです。

Weld weld = new Weld(); 
try (WeldContainer container = weld.initialize()) { 
    // inside this try-with-resources block you have CDI container booted 
    //now, ask it to give you an instance of AutoServiceCallerImpl 
    AutoServiceCallerImpl as = container.select(AutoService.class).get(); 
    as.callAutoService(); 
} 

今、あなたのコードと第二の問題。 @Namedの使用は、EL解像度を目的としています。例えば。 JFSページでは、Beanに直接アクセスできます。 がほしいと思うのは、いくつかの実装を区別して指定することです。そのCDIには修飾子があります。それらの使用方法の詳細については、this documentation sectionを参照してください。

関連する問題