繁体   English   中英

泽西岛(REST)子资源CDI

[英]Jersey (REST) Sub-resource CDI

我正在开发一个企业项目,该项目具有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工作在它们上面或者通过构造函数传递一个完美的解决方案?

谢谢!

您应该能够使用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;
}  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM