2011-09-17 16 views
8

私はEJBモジュールとGlassFish v3.1、Weld v1.1およびJerseyで動作するWebプロジェクトを持つエンタープライズプロジェクトに取り組んでいます。 EJBでは、エンティティクラスManufacturerを定義し、セッションファサードManufacturerFacadeを生成しました。ジャージー(REST)サブリソースCDI

ウェブプロジェクトでは、ManufacturerのインスタンスをRESTで公開したいと考えています。そのために、私は次のリソースを作成しました:

ManufacturersResourceは、データベースに格納されているすべてのメーカーのリストを返すコンテナリソースです。これは、ManufacturerFacadeを注入し、findAll()メソッドを呼び出すことによってそうする。略称コード:

@RequestScoped 
@Path("/manufacturer") 
public class ManufacturersResource { 

    @Inject 
    private ManufacturerFacade manufacturerFacade; 

    @GET 
    @Produces("application/xml") 
    public List<Manufacturer> getManufacturers() { 
     return manufacturerFacade.findAll(); 
    } 
} 

このリソースは、サブリソースを持って次のように

@Path("{id}") 
public ManufacturerResource getManufacturer(@PathParam("id") String id) { 
    return ManufacturerResource.getInstance(id, manufacturerFacade); 
} 

ManufacturerFacadeに見えます:

私たちは別のクラスである
public class ManufacturerResource { 

    @Inject 
    private ManufacturerFacade manufacturerFacade; 

    private long id; 

    private ManufacturerResource(String id) { 
     this.id = Long.parseLong(id); 
    } 

    public static ManufacturerResource getInstance(String id,) { 
     return new ManufacturerResource(id); 
    } 

    @GET 
    @Produces("application/xml") 
    public Manufacturer getManufacturer() { 
     return manufacturerFacade.find(id); 
    } 

}

しかし、ManufacturerResourceはフレームワークによってインスタンス化されておらず、th私たちはManufacturerFacadeを注射していません。

私は単にコンストラクタでアイテムリソース(ManufacturerResource)にコンテナリソース(ManufacturersResource)からファサードを渡すことができますが、それは何とかDIは、同様にそれらの作業を取得するか、コンストラクタAを通過させている可能です知っています完璧な解決策はここにありますか?

ありがとうございます!

+0

私はクラス 'ManufacturersResource'が' ManufacturersResourceController'と明確に名付けられていると思います。 – stratwine

+0

あなたは正しいです。私はまだ足を濡らしてRESTに入れているので、私はまだリファクタリングしていませんが、私は行います。提案していただきありがとうございます! – Laurens

答えて

14

これにResourceContextを使用し、setterを使用してidを渡すことができるはずです。動作しない場合はバグを報告してください(http://java.net/jira/browse/JERSEY)。

@Context 
private ResourceContext resourceContext; 

@Path("{id}") 
public ManufacturerResource getManufacturer(@PathParam("id") String id) { 
    ManufacturerResource r = resourceContext.getResource(ManufacturerResource.class); 
    r.setId(id); 
    return r; 
} 
+0

こんにちはマーティン、ありがとう!それは完璧に働いています。私は、アイテム( 'ManufacturerResource')は' @ RequestScoped 'でなければならないということを追加して、それを働かせるべきですが、今はそれです! – Laurens

関連する問題