Я просматриваю учебник 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;
}
}