2017-02-24 85 views
0

@RequestScoped CDI BeanをJava EE 7 WebSocketエンドポイントに挿入します。WebSocketエンドポイントとCDIインジェクション:スコープのアクティブなコンテキストがありません。RequestScoped

ただし、エラーWELD-001303: No active contexts for scope type javax.enterprise.context.RequestScopedが発生しています。

私は間違って何をしていますか、なぜそれが不可能なのですか?

@ServerEndpoint("/serverpush") 
public class ContratoEndpoint { 

    @Inject 
    private Storage storage; 

} 

そして、私は次のスタックトレースを取得しています:

org.jboss.weld.context.ContextNotActiveException: WELD-001303: No active contexts for scope type javax.enterprise.context.RequestScoped 
    at org.jboss.weld.manager.BeanManagerImpl.getContext(BeanManagerImpl.java:689) 
    at org.jboss.weld.bean.ContextualInstanceStrategy$DefaultContextualInstanceStrategy.getIfExists(ContextualInstanceStrategy.java:90) 
    at org.jboss.weld.bean.ContextualInstanceStrategy$CachingContextualInstanceStrategy.getIfExists(ContextualInstanceStrategy.java:165) 
    at org.jboss.weld.bean.ContextualInstance.getIfExists(ContextualInstance.java:63) 
    at org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:83) 
    at org.jboss.weld.bean.proxy.ProxyMethodHandler.getInstance(ProxyMethodHandler.java:125) 

答えて

1

@Johnが述べたように、RequestContextはWebSocketメソッドではアクティブではありません。 Deltaspike(良い選択肢)を使用する代わりに、独自のインターセプタを作成して溶接RequestContextを有効/無効にすることもできます。

あなたがWildflyを使用しているとして、あなたが提供する依存関係として溶接を使用することができます。

<dependency> 
    <groupId>org.jboss.weld</groupId> 
    <artifactId>weld-core</artifactId> 
    <version>2.2.12.Final</version> 
    <scope>provided</scope> 
</dependency> 

次にあなたがInterceptorBinding@RequestContextOperationを定義することができます。

import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target; 

import javax.interceptor.InterceptorBinding; 

@InterceptorBinding 
@Retention(RetentionPolicy.RUNTIME) 
@Target({ ElementType.METHOD, ElementType.TYPE }) 
public @interface RequestContextOperation 
{ 

} 

そして、我々は/非アクティブ化を有効に対応するRequestContextInterceptorRequestContext

import javax.inject.Inject; 
import javax.interceptor.AroundInvoke; 
import javax.interceptor.Interceptor; 
import javax.interceptor.InvocationContext; 

import org.jboss.weld.context.RequestContext; 
import org.jboss.weld.context.unbound.Unbound; 

@Interceptor 
@RequestContextOperation 
public class RequestContextInterceptor { 

    /** The RequestContext */ 
    @Inject 
    @Unbound 
    private RequestContext m_requestContext; 

    /** 
    * 
    * @param p_invocationContext 
    * @return 
    * @throws Exception 
    */ 
    @AroundInvoke 
    public Object activateRequestContext(final InvocationContext p_invocationContext) throws Exception { 
     try { 
      m_requestContext.activate(); 
      return p_invocationContext.proceed(); 
     } finally { 
      m_requestContext.invalidate(); 
      m_requestContext.deactivate(); 
     } 
    } 
} 

次に、あなたのクラスまたは特定の方法で@RequestContextOperationアノテーションを使用することができます:私はWildFly、外部依存せずに任意のソリューションを使用しています

@ServerEndpoint("/serverpush") 
public class ContratoEndpoint { 

    @Inject 
    private Storage storage; 

    @OnMessage 
    @RequestContextOperation 
    public String handleMessage(String message){ 

     // Here the @RequestScoped bean is valid thanks to the @RequestContextOperation InterceptorBinding 
     storage.yourMethod(); 
     .... 
    } 

} 
+1

@BonanzaOne @Rouliboyこれは良いアプローチですが、私は最初に** Weld **に存在するものを試してみます。 Weld APIに依存関係を設定した場合、メソッド/クラスに、事前に定義されたインターセプタバインド '@ ActivateRequestContext'を使用して注釈を付けることができます。詳細については、[Weld Doc](http://docs.jboss.org/weld/reference/latest/en-US/html_single/#_request_context)を参照してください。これはもともとSE環境用に設計されていますが、EEでも同じように動作するはずです。 – Siliarus

+0

@Siliarus:私はこれを知らなかった、情報のおかげで! – Rouliboy

1

WebSocketを、そのメソッドのリクエストスコープのコンテキストを初期化しない私のようなエンドポイントで@Inject

@Named 
@RequestScoped 
public class Storage { 

} 

呼び出し。 deltaspike context controlを使用して、メソッド呼び出しの要求コンテキストを手動で開始することができます。

+0

? – BonanzaOne

+0

ソースコードを使用しているため、Apacheのライセンスが必要です。https://github.com/apache/deltaspike/blob/master/deltaspike/cdictrl/impl-weld/src/main/java/org/apache/ deltaspike/cdise/weld/WeldContextControl.java#L158これらの複雑さはすべて必要ではないかもしれません。 –

+0

@BonanzaOne:WildFlyサーバーの一部であるWeldを使用して回答を更新しました。 – Rouliboy

関連する問題