2016-10-07 10 views
2

CDTのインジェクションの使用がundertowを使用してWebSocketで機能しない理由を理解できません。Undertow Websocket Bean Injection CDI Issue

以下は、単純なwebsocketエンドポイントのコードです。

@ServerEndpoint("/") 
public class TestWebSocketEndpoint { 

    @Inject 
    private RetrieveAccessor retrieveAccessor; 

    private final Logger logger = Logger.getLogger(this.getClass().getName()); 

    @OnOpen 
    public void onConnectionOpen(Session session) { 
     logger.info("Connection opened ... " + session.getId()); 
    } 

    @OnMessage 
    public String onMessage(String message) { 

     if (!message.isEmpty()) { 
      return message; 
     } 

     System.out.println("RETRIEVE BEAN -> " + retrieveAccessor); 
     if (retrieveAccessor != null) { 
      return "BEAN NOT NULL"; 
     } 
     return ":("; 
    } 

    @OnClose 
    public void onConnectionClose(Session session) { 
     logger.info("Connection close .... " + session.getId()); 
    } 

} 

もちろん、注入されたプロパティはnullです。このデプロイと後述のステートレスBeanの注入には、もちろん、残りの部分を使用しても問題はありません。この問題を回避する方法はありますか?私が必要とするプロパティーをBeanであれば、どうやったら問題になるのでしょうか?それは間違いなく機能するからです。

RetrieveAccessor retrieveAccessor =新しい.... {コード}

+0

あなたの質問の最後の部分は混乱しています。 'RetrieveAccessor'をインスタンス化していますか?また、あなたはweldサーブレットを使っていますか?ワイルドフライ? –

+0

私はちょうどundertowを使用しています。私の質問の最後の部分は、Beanオブジェクトの通常のクラス初期化が機能していることを説明しています。 – thekevshow

答えて

2

@ServerEndpointアノテーション付きクラスでインジェクションを行う簡単な方法は、getEndpointInstance(Class endpointClass)メソッドをオーバーライドしてエンドポイントインスタンスの作成を処理するカスタムコンフィギュレータを設定してCDIでインスタンス化することです。

https://tyrus.java.net/documentation/1.13/user-guide.html#d0e464

注釈付きエンドポイント:

@ServerEndpoint(value = "/", configurator = CDIEndpointConfigurator.class) 
public class TestWebSocketEndpoint { 
    ... 
} 

カスタムコンフィギュレータ:

public class CDIEndpointConfigurator extends ServerEndpointConfig.Configurator { 

    @Override 
    public <T> T getEndpointInstance(Class<T> endpointClass) throws InstantiationException { 
     return CDI.current().select(endpointClass).get(); 
    } 
} 
+0

私はこれを今日や明日後に試して、これが正しいとマークします。私はこれを見ましたが、実際に試みなかったので、あなたはそれをうまく説明したと思います。 – thekevshow

+0

早くこれに慣れることができなかったことを申し訳ありません。前と同じようなことを試してみましたが、間違っていたはずです。これは正しい答えです、ありがとうございます。 – thekevshow

+0

大歓迎です。 –

1

アンダートウは、サーブレットコンテナです。 Weld(またはOWB)はCDIサポートを提供します。 Undertowをどのようにインスタンス化しているのかは分かりませんが、Weld(またはその他のCDI実装)を活用する必要があります。

ここでは、その操作方法の例を示します。 CDI Extensionを利用してエンドポイントを見つけてください。それができたら、register them in Undertow

ハンモックを利用しても構いません。

+0

私はスタンドアロンのWebサービス/ mircroサービスとしてundertowを使用しています。私はもともとあなたが尋ねてきたことを理解していませんでしたが、ええ、CDIのサポートを提供するためにWeldを使っていました。これは参考になるはずです。私はあなたが私の問題を解決してくれたことを、私はこれを正しい/受け入れられた答えとしてマークします。ありがとうございました。 (PS:あなたのフレームワークはクールです) – thekevshow

関連する問題