Джерси (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;
}  
Другие вопросы по тегам