Джерси (REST) Подресурс CDI
Я работаю над корпоративным проектом, в котором есть модуль EJB и веб-проект, работающий на GlassFish v3.1, Weld v1.1 и Jersey. В EJB я определил класс сущности Manufacturer
и сгенерировал фасад сеанса ManufacturerFacade
,
В веб-проекте хочу выставить 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
не создается в рамках и, следовательно, не имеет ManufacturerFacade
впрыскивается.
Я знаю, я могу просто передать фасад из контейнера ресурса (ManufacturersResource
) к ресурсу предмета (ManufacturerResource
) через конструктор, но возможно ли как-то заставить DI работать и над ними, или это просто передать его через конструктор?
Спасибо!
1 ответ
Вы должны быть в состоянии использовать ResourceContext для этого и передать идентификатор с помощью установщика. Пожалуйста, сообщите об ошибке, если она не работает (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;
}