我正在开发一个企业项目,该项目包含一个EJB模块和一个在GlassFish v3.1,Weld v1.1和Jersey上运行的Web项目。在EJB中,我定义了一个实体类Manufacturer
并生成了一个会话外观ManufacturerFacade
。
在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
没有被框架实例化,因此没有注入ManufacturerFacade
。
我知道我可以通过构造函数简单地将外观从容器资源(ManufacturersResource
)传递给项目资源(ManufacturerResource
),但是也可以以某种方式让DI在它们上面工作或者是通过构造函数传递一个完美的解决方案吗?
谢谢!
答案 0 :(得分:15)
您应该能够使用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;
}