2017-01-23 5 views
0

JAX-RS、CDI、およびEJBを備えたWebアプリケーションがあります。各リソースでステートレスセッションビーンを挿入しました。私の質問は、JAX-RSのプロバイダとステートレスSesionBeanに同じインスタンスを挿入できるかどうかです。私は、ContainerRequestFilterからステートレスSesionBeanに各リクエストに含まれるいくつかのデータを渡そうとしています。すべてのEJBコンポーネントは、jax rsリソースによってのみアクセスされます。CDIを使用して同じインスタンスを伝播する方法

例:

public class Bean { 
    private String attr; 

    // getter and setter 
} 

@Stateless 
public class BeanService { 

    @Inject 
    Bean bean; 

    public void doStuff() { 
     bean.getAttr(); 
     // do something with bean.attr 
    } 
} 

@Path("/bean") 
public class BeanResource { 

    @Inject 
    BeanService service; 

    @GET 
    public void doStuff() { 
     service.doStuff(): 
    } 
} 

@Provider 
public class BeanRequestFilter implements ContainerRequestFilter { 

    @Inject 
    Bean bean; 

    @Override 
    public void filter(ContainerRequestContext containerRequestContext) throws IOException { 
     String data = null; // <- get data from request 
     bean.setAttr(data); 
    } 
} 

更新

変更POJOのための豆、私の唯一の目的は、すべてのリクエストに来て、各呼び出しでtransmitedすることができますいくつかの状態を保持するクラスを使用していますPojoResourceからPojoServiceまですべてのサービスがこのデータを取得し、すべてのメソッドのパラメータとしてこれを渡したくないため、このようにしたいと思います。

答えて

0

あなたBeanクラスは、基本的にスコープを要求されるようにこれはそうにそれを変更し、なります

@RequestScoped 
public class Bean { 
    ... 
} 

は望ましい効果を持つはずです。同じインスタンスがBeanRequestFilterBeanServiceの両方に注入されます。

ContainerRequestContextを直接BeanServiceに注入して、Beanを完全に忘れて、あなたが探しているものを得ることもできると思います。

@Stateless 
public class BeanService { 

    @Context 
    ContainerRequestContext containerRequestContext; 

    public void doStuff() { 
     // <- get data from request 
    } 
} 
+0

感謝BeanクラスのスコープをRequestScopedの動作に変更する提案。 – ffcc

0

あなたはBean@ApplicationScopedannotationを参照してくださいCDIを使用してシングルトンのようなものになりたい場合は(その場合にはBeanSersializableする必要があります)

それとも、EJB BeanServiceをシングルトンにしたい場合は@Singletonannotation

を見ます
0

質問に答える前に、Beanを更新しないでください。 Beanの概念は、サービスを提供し、データを使用して要求を処理する概念です。

もちろん、Beanとしてデータを提供することはできますが、そのデータを使用して更新する必要はありません。

したがって、BeanRequestFilterを使用してBeanを生成し、生成されたBeanを挿入するようにします。

これにもかかわらず、これはリクエストベースのデータであることがわかりますか?それはヘッダーデータですか、リクエストパラメータですか?そして、私はあなたがJAX-RS @QueryParamまたは@HeaderParamまたは@PathParamまたは@FormParamまたはJAX-RSリソースクラス内@CookieParamを使用することを示唆し、その後、そのため、あなたのBeanServiceにドメインオブジェクトパラメータなどのデータを提供します。

@Path("/api/resource-path") 
public class MyResource { 

    public void processSomething(@QueryParam("qparam") String param, @HeaderParam("hparam") String hParam) { 
     MyDomain domain = new MyDomain(qParam, hParam); 
     myService.process(domain); 
    } 
} 
関連する問題