2017-01-05 8 views
1

GuiceアノテーションのためにシングルトンのクラスControllerがあります。このクラスを別のシングルトンクラスで拡張すると、アノテーションのために1つしかないはずの新しいリストが作成されます。ここControllerのコードは次のとおりです。(Guice)シングルトンクラスを拡張すると別のリストになる

@Singleton 
public class Controller extends HttpServlet { 

    @Inject protected IAccountService accountService; 
    @Inject protected ITalenService talenService; 
    @Inject protected List<IAppGegevensService> appGegevensServices; 
    @Inject protected List<ITalenService> talenServices; 

私は2 ITalenServicesを持って知っているが、それが原因で別の理由のためです。 私のモジュールは、コードのこの部分が含まれています。ここ

@Singleton @Provides 
List<IAppGegevensService> provideAppGegevensServices() { 
    return new ArrayList<>(); 
} 

@Singleton @Provides 
List<ITalenService> provideTalenServices() { 
    return new ArrayList<>(); 
} 

Controllerを拡張し、リストを設定し、クラスのコードです:

@Singleton 
public class MaakNieuweAppController extends Controller { 

    @Override 
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    req.setAttribute("talen", talenService.getAlleTalen()); 
    addAppGegevensService(accountService.findAccount((String) req.getSession().getAttribute("email"))); 
    addTalenService(accountService.findAccount((String) req.getSession().getAttribute("email"))); 
    req.getRequestDispatcher("kiezenTalen.jsp").forward(req, resp); 
    } 

} 

ここでの値のいずれかを要求クラスのコードがありますリストで:できるだけ早く私はリストappGegevensServicesまたはtalenServicesにオブジェクトを追加し、リストIを求めるよう

@Singleton 
@MultipartConfig 
public class AlgemeneGegevensController extends Controller { 

    private Account account; 
    private IAppGegevensService appGegevensService; 

    @Override 
    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    account = accountService.findAccount((String) req.getSession().getAttribute("email")); 
    appGegevensService = getAppGegevensService(account); 

n別のクラス(またはそのリスト内の特定のインスタンス)はnullです。リストが1つしかないことを確認するにはどうすればよいですか?

+0

あなたは '何を誤解「のみであるため、注釈の1がなければならない間、私は、新しいリストを取得します」@シングルトンはそうします:それはguiceに、バインドされたときに特定のクラスのインスタンスを1つだけ作成するように指示します。 'Controller'のインスタンスと' MaakNieuweAppController'のインスタンスがある場合、 'Controller'はインスタンスが2つあるのでシングルトンではありません。 –

+0

私はそれがguiceにクラスのインスタンスを1つ作成するように指示していますが、あまりにも正しいリストが1つしかないはずです。コントローラがシングルトンではないのはなぜですか?それは注釈のためか、間違っていますか? ^^ – Sjoerd

+0

アドバイスの言葉:フィールドインジェクション(アトリビュートにアノテーションを挿入する)を使用する場合は、コンストラクタ内部で何をするかに非常に注意してください。あなたはここに注入された豆にアクセスできない!あなたの例ではアクセスしませんが、コンストラクタ内のものを初期化する必要がある場合は、コンストラクタインジェクションを使用するのがベストです。 –

答えて

0

だけあなたが@Singletonが何を誤解ためのアノテーション

の1がなければならない間、私は、新しいリストを取得する:それは単に結合した場合にのみ、その特定のクラスの1つのインスタンスを作成するために、Guiceのを伝えます。

ControllerのインスタンスとMaakNieuweAppControllerのインスタンスを「手作業で」作成した場合、期待通りにリストインスタンスを共有することはできません。Guiceがそれらを作成するときも同じです。 Guiceは単にControllerの同じインスタンスを何度も何度も繰り返し、同じインスタンスをMaakNieuweAppControllerと繰り返します。

(あなたがControllerMaakNieuweAppControllerのいずれかのインスタンスを持っている場合は、それの2つのインスタンスがあるので、Controllerは、とにかくシングルトンではないことに注意してください。)

をあなたは彼らがリストを共有したい場合リストインスタンスを挿入し、それがシングルトンインスタンスにバインドされていることを確認する必要があります。

public class Controller extends HttpServlet { 
    @Inject 
    protected List<IAppGegevensService> appGegevensServices; 

} 

、その後

@Provides @Singleton 
List<IAppGegevensService> provideList() { ... } 

(またはしかし、あなたがそれを提供したい)

+0

あなたの答えをありがとうAndy!私は学生ですし、Guiceには新しくなっていますので、どこでprovideListメソッドを配置するかはわかりません。それはコントローラにあるべきですか?そして、私はこのメソッドをどこで呼び出すべきですか?再び、私はこれで新しいです。 :) – Sjoerd

+0

これはあなたのモジュールにあるはずです。 –

+0

申し訳ありませんが、私は何を意味するのですか。 – Sjoerd

関連する問題