2011-09-17 82 views
8

我正在開發一個企業項目,該項目具有在GlassFish v3.1,Weld v1.1和Jersey上運行的EJB模塊和Web項目。在EJB中,我定義了一個實體類Manufacturer並生成了一個會話外觀ManufacturerFacadeJersey(REST)子資源CDI

在Web項目中,我希望通過REST公開Manufacturer實例。爲此,我創建了以下資源:

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

我知道我可以簡單地通過構造函數傳遞從容器資源(ManufacturersResource)的項目資源(ManufacturerResource)的門面,但它可能以某種方式得到DI對他們的工作,以及或將其通過構造一個這裏完美的解決方案?

謝謝!

+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