объединение уровня JAX-RS, уровня EJB, уровня JSF в один POJO в Java EE7?

Я просматриваю учебник Java EE 7, который поставляется с GlassFish. Насколько я понимаю, CDI injection возможно в JAX-RS layer, что невозможно в предыдущих версиях EE - поправьте меня, если я ошибаюсь.

Кроме того, один bean-компонент может быть EJB, WebService и managed bean (для обработки JSF).

Пример ниже взят непосредственно из учебник. Как вы видите, используя три аннотации @Named, @Stateless and @Path, три слоя объединяются в один. Я предполагаю, что это невозможно в более ранней версии EE. Это все замечательно и сокращает много кода. Но нет ли серьезных последствий для дизайна приложения. Например, в настоящее время я использую EE 5, где уровень представления (JSF), бизнес-уровень (EJB) и уровень веб-сервиса (JAX-RS) четко разделены. Три разных класса и контейнер управляют внедрением зависимостей. Есть ли какая-либо дыра в безопасности в «конфетной» версии, объединяющей все три в одном, как показано ниже.

/**
 * @author Arun Gupta
 */
@Named
@Stateless
@Path("movie")
public class MovieFacadeREST extends AbstractFacade<Movie> {
    @PersistenceContext
    protected EntityManager em;

    public MovieFacadeREST() {
        super(Movie.class);
    }

    @POST
    @Override
    @Consumes({"application/xml", "application/json"})
    public void create(Movie entity) {
        super.create(entity);
    }

    @PUT
    @Override
    @Consumes({"application/xml", "application/json"})
    public void edit(Movie entity) {
        super.edit(entity);
    }

    @DELETE
    @Path("{id}")
    public void remove(@PathParam("id") Integer id) {
        super.remove(super.find(id));
    }

    @GET
    @Path("{id}")
    @Produces({"application/xml", "application/json"})
    public Movie find(@PathParam("id") Integer id) {
        return super.find(id);
    }

    @GET
    @Override
    @Produces({"application/xml", "application/json"})
    public List<Movie> getAll() {
        return super.getAll();
    }

    @GET
    @Path("{from}/{to}")
    @Produces({"application/xml", "application/json"})
    public List<Movie> findRange(@PathParam("from") Integer from, @PathParam("to") Integer to) {
        return super.findRange(new int[]{from, to});
    }

    @GET
    @Path("count")
    @Produces("text/plain")
    public String countREST() {
        return String.valueOf(super.count());
    }

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

}

person brain storm    schedule 09.12.2014    source источник
comment
Где этот учебник? То, о чем вы спрашиваете, также должно быть упомянуто в этом руководстве.   -  person Tiny    schedule 10.12.2014
comment
@Tiny: код указан выше для его источника.   -  person brain storm    schedule 10.12.2014


Ответы (1)


Java EE 6 включает JAX-RS 1.1 и исправление C002 из журнал изменений JAX-RS 1.1 требуется поддержка CDI (он же JSR 299):

В продукте, который также поддерживает управляемые компоненты, реализации ДОЛЖНЫ поддерживать использование управляемых компонентов в качестве корневых классов ресурсов, поставщиков и подклассов приложений. В продукте, который также поддерживает JSR 299, реализации ДОЛЖНЫ аналогичным образом поддерживать использование управляемых компонентов в стиле JSR299. Провайдеры и подклассы приложений ДОЛЖНЫ быть одиночками или использовать область приложения.

Так что раньше такое было возможно. См. худший блог о Java EE 6, в котором объединены многие технологии EE 6 в один класс.

person Brett Kail    schedule 10.12.2014