Джерси (REST) ​​Подресурс CDI - PullRequest
       15

Джерси (REST) ​​Подресурс CDI

8 голосов
/ 17 сентября 2011

Я работаю над корпоративным проектом, в котором есть модуль 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 Ответ

15 голосов
/ 17 сентября 2011

Вы должны быть в состоянии использовать 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;
}  
...