Servlets 3.0, Commons Annotations y Bean Validation

Siguiendo con los artículos de resumen de las principales novedades introducidas en Java EE 6 a continuación algunas notas sobre Servlets 3.0, Commons Annotations 1.0 y Bean Validation 1.0. Estas dos últimas son nuevas especificaciones que regulan anotaciones ya existentes o estandarizaciones de anotaciones habituales encontradas en muchas otras especificaciones y librerías de terceros.

Servlet 3.0
Soporte de anotaciones
  • @WebServlet: define un servlet. Atributos obligatorios: value o urlPatterns (no los dos a la vez).

Ejemplos:

@WebServlet(”/foo”)
@WebServlet(name=”MyServlet”, urlPatterns={"/foo", "/bar"})
  • @WebFilter: define un filtro. Atributos obligatorios: value o urlPatterns (no los dos a la vez).

Ejemplos:

@WebFilter(“/foo”)
  • @WebListener: uso directo sin atributos.
  • @MultipartConfig: se puede utilizar en un Servlet para indicar que recibirá los parámetros como tipo mime/multipart.

Otras anotaciones:@WebInitParam: atributo de las anotaciones @WebServlet y @WebFilter.

Seguridad

Anotaciones de seguridad aplicables a servlets o métodos de servlets (doXXX o service) individualmente:

@RolesAllowed
@DenyAll
@PermitAll
@TransportProtected
Procesado asíncrono

Se han introducido una serie de métodos en la clase ServletRequest para iniciar el modo asíncrono de procesado de peticiones y romper así la correspondencia clásica 1 a 1 entre el número de peticiones en proceso y el número de hilos de ejecución sirviendo esas peticiones. Se define un atributo de la anotación @WebServlet para indicar que se soporta el modo asíncrono. Probablemente no lo utilizaremos directamente porque las librerías JSF lo utilizaran para implementar Comet de manera más eficiente. Ver sección 2.3.3.3 de la especificación.

Subida de ficheros

Se incluye soporte para la codificación de peticiones en formato  mime/multipart. Ya hemos visto anteriormente alguna anotación que hace referencia a este soporte.Como en el anterior caso del procesado asíncrono probablemente no lo utilizaremos directamente ya que es algo que está presente y soportado por JSF en un nivel más alto.

Configuración dinámica

Se ha añadido soporte para añadir y quitar servlets y filtros de la aplicación web desde código. De esa manera se busca que sobre todo las librerias dispongan de un mecanismo más flexible y completo para poder configurarse de manera automática. Actualmente es bastante habitual que una librería proporcione instrucciones para añadir entradas al web.xml que configuren el uso de la librería.

Bean Validation 1.0

Resumen: mecanismo estándar tanto para crear restricciones y validadores como para utilizar los mecanismos estándar que ya se incluyen. Dicho de otra manera, se especifican anotaciones para definir validaciones de los datos y un mecanismo para crear nuestras propias anotaciones. Algunos ejemplos de las anotaciones estándar:

public class Email {

   @NotEmpty @Pattern(".+@.+\\.[a-z]+")
   private String from;

   @NotEmpty @Pattern(".+@.+\\.[a-z]+")
   private String to;

   @NotEmpty
   private String subject;

   @NotEmpty
   private String body;

   // setters and getters
   ...
}

The goal of this specification is not to provide one solution to fit all your validation needs – not at all. There are many types of constraints in an application that span different layers. Data constraints on the database level, business rules on the service level, and even UI constraints purely on the UI level. JSR-303 target what I like to refer to as the model constraints. The idea is very simple – some constraints on your model are tightly coupled to it and therefore belongs next to it. The infrastructure defined by JSR-303 enables you to do that – you can describe the constraints using constraint annotations on your model and validate your model using constraint validators.

Built-in constraints
  • @AssertTrue/AssertFalse(Boolean value) - Boolean
  • @DecimalMax/DecimalMin(String value) – BigDecimal, BigInteger, String, byte/Byte, short/Short, int/Integer, long/Long
  • @Digits(int integer, int fraction) - BigDecimal, BigInteger, String, byte/Byte, short/Short, int/Integer, long/Long
  • @Future/Past() – Date, Calendar
  • @Max/Min(long value) – BigDecimal, BigInteger, String, byte/Byte, short/Short, int/Integer, long/Long
  • @Null/NotNull() – Object
  • @Pattern(String regexp, Flag flags) - String
  • @Size(int min, int max) – String, Collection, Map, Array.length
Grupos, restrictores personalizados, validadores

Los mecanismos para crear nuestras propias restricciones en forma de anotación permiten agrupar otras restricciones o crearlas a partir de código.

Common Annotations 1.0

Esta especificación simplemente define nombres comunes para muchas anotaciones que han ido apareciendo en diferentes especificaciones y su objetivo es la normalización.

  • The Generated annotation is used to mark source code that has been generated.
  • The Resource annotation is used to declare a reference to a resource.
  • The Resource annotation is used to declare a reference to a resource.
  • The PostConstruct annotation is used on a method that needs to be executed after dependency injection is done to perform any initialization.
  • The PreDestroy annotation is used on methods as a callback notification to signal that the instance is in the process of being removed by the container.
  • The RunAs annotation defines the role of the application during execution in a Java EE container.
  • The RolesAllowed annotation specifies the security roles permitted to access method(s) in an application.
  • The PermitAll annotation specifies that all security roles are allowed to invoke the specified method(s), that is, that the specified method(s) are “unchecked”.
  • The DenyAll annotation specifies that no security roles are allowed to invoke the specified method(s), that is, that the method(s) are to be excluded from execution in the Java EE container.
  • The DeclareRoles annotation is used to specify the security roles by the application. Referencias

  • http://www.oracle.com/technetwork/java/javaee/tech/index.html

  • Especificación Servlets 3.0
  • Especificación Common Annotations 1.0
  • Especificación Bean Validation 1.0