Cambios del comportamiento de JAX-RS 2.0

La implementación de JAX-RS 2.0 contiene algunos cambios de comportamiento. Estos cambios podrían provocar que las aplicaciones se comporten de forma distinta o fallen en JAX-RS 2.0 si las aplicaciones se actualizan desde JAX-RS 1.1.

La lista siguiente describe las diferentes entre JAX-RS 1.1 y JAX-RS 2.0:
  • En JAX-RS 1.1 y Jersey, si un EJB o clase CDI crea una nueva instancia que se devuelve por el método JAX-RS application.getSingletons(), el motor utiliza la instancia devuelta y no intenta acceder a la instancia desde el EJB o contenedor CDI. En JAX-RS 2.0, para el mismo caso de uso, el motor intenta acceder a la instancia desde el contenedor EJB o CDI. Si se puede acceder a la instancia, se utiliza la instancia recuperada. Pero si no se puede acceder a la instancia se utiliza la instancia devuelta del método getSingletons(). Por ejemplo:
    @Override
    public SetObject getSingletons(){
        SetObject objs = new HashSetObject();
        objs.add(new CDIInjectResource());
        objs.add(new EJBInjectResource());
        return objs;
    }
  • JAX-RS 2.0 incluye muchos cambios de la API cuando maneja el archivo MultiPart. Por ejemplo, en JAX-RS 1.1, se puede utilizar @FormParam para manejar el archivo MultiPart, pero en JAX-RS 2.0, solo se puede utilizar @IMultipartBody o @IAttachment MultiPart. Para obtener más información, consulte Configuración de un recurso para recibir datos de varias partes/formularios desde un envío de un formulario HTML en JAX-RS 2.0.
  • Los paquetes jackson que se muestran como API de terceros en JAX-RS 1.1. ya no se muestran en JAX-RS 2.0. Si desea utilizar cualquiera de las API org.codehaus.jackson en su aplicación, debe comprimir los paquetes jackson en su aplicación.
  • Si especifica javax.ws.rs.core.Application para el nombre de servlet en el archivo web.xml, el método getClasses en el objeto Aplicación inyectado por @Context, no devuelve las clases de recurso.
    	
           <servlet>
    		<servlet-name>javax.ws.rs.core.Application</servlet-name>
    	</servlet>
    	<servlet-mapping>
    		<servlet-name>javax.ws.rs.core.Application</servlet-name>
    		<url-pattern>/*</url-pattern>
    	</servlet-mapping>
  • La especificación JAX-RS 2.0 indica que un proveedor es una clase que implementa una o más interfaces JAX-RS y que puede anotarse con @Provider para el descubrimiento automático. En este escenario, una clase tiene la anotación @Local que hace referencia a una interfaz de proveedor, pero no implementa ninguna interfaz de proveedor POJO, por lo que no es un proveedor válido. Por ejemplo:
    @Stateless
    @Local(OneLocalInterfaceMyOtherStuffMessageBodyWriter.class)
    public class OneLocalInterfaceMyOtherStuffProvide
  • Si utiliza las anotaciones de MessageBodyReader y MessageBodyWriter, @Consumes y @Produces, es posible que algunos tipos de soporte estén restringidos. Utilice el método isReadable o isWriteable para comprobar el tipo de soporte. Por ejemplo:
    @Provider
    @Consumes("<custom/type>")
    @Produces("<custom/type>")
    @Singleton
    public class MyMessageBodyReaderAndWriter implements MessageBodyReader,MessageBodyWriter {
                    
        public boolean isReadable(Class<?> type,
                                  Type genericType,
                                  Annotation[] annotations,
                                  MediaType mediaType) {
            if (mediaType.toString().equals("<custom/type>"))
                return true;
            return false;
        }
    
         public boolean isWriteable(Class<?> type,
                                  Type genericType,
                                  Annotation[] annotations,
                                  MediaType mediaType) {
            if (mediaType.toString().equals("<custom/type>"))
                return true;
            return false;
        }
    ...
    }
  • Puede utilizar el proceso asíncrono en JAX-RS 2.0 para procesar hebras. Para obtener más información, consulte Proceso asíncrono.
  • Ninguna de las API de Wink que se muestran como API de terceros en JAX-RS 1.1 se admiten en JAX-RS 2.0. A continuación se muestra una lista parcial:
    • org.apache.wink.common.model.atom.AtomEntry. Para obtener más información sobre la integración de JAX-RS 2.0 con Atom, consulte Integración de JAX-RS 2.0 con Atom.
    • org.apache.wink.client.handlers.BasicAuthSecurityHandler. Si desea utilizar la autenticación básica en JAX-RS 2.0, consulte los siguientes fragmentos de código:
      1. Utilice ClientRequestFilter en la API de cliente estándar de JAX-RS 2.0 como se muestra en el ejemplo de código:
        import java.io.IOException;
        import java.io.UnsupportedEncodingException;
        import javax.ws.rs.client.ClientRequestContext;
        import javax.ws.rs.client.ClientRequestFilter;
        import javax.ws.rs.core.MultivaluedMap;
        import javax.xml.bind.DatatypeConverter;
        
        public class BasicAuthFilter implements ClientRequestFilter {
        
            private final String usr;
            private final String pwd;
        
            public BasicAuthFilter(String usr, String pwd) {
                this.usr = user;
                this.pwd = pwd;
            }
        
            public void filter(ClientRequestContext requestContext) throws IOException {
                MultivaluedMap<String, Object> headers = requestContext.getHeaders();
               
             String token = this.usr + ":" + this.pwd;
             final String basicAuthentication ="Basic " + DatatypeConverter.printBase64Binary(token.getBytes("UTF-8"));
             headers.add("Authorization", basicAuthentication);
            }
        }
      2. Registre en ClientBuilder:
        ClientBuilder cb = ClientBuilder.newBuilder();
        cb.register(new BasicAuthFilter("user","password"));
    • org.apache.wink.client.handlers.LtpaAuthSecurityHandler. Si desea utilizar el cliente de seguridad basado en LTPA para proteger recursos en sentido descendente, consulte Protección en sentido descendente de recursos JAX-RS.
    • org.apache.wink.server.internal.providers.exception.EJBAccessExceptionMapper. Esta API ya no está soportada por que es el ExceptionMapper especificado por Wink. Puede definir su propio ExceptionMapper para correlacionar EJBAccessException.
    • com.ibm.websphere.jaxrs.server.IBMRestFilter. Esta API ya no está soportada porque está basada en el filtro Wink.
    Nota: Detecta si hay paquetes jar de wink en su aplicación. Si hay algún paquete wink en su aplicación, debe realizar los pasos siguientes:
    1. Asegúrese de que haya una subclase de aplicación definida.
    2. Al menos getClasses o getSingletons no debe devolver Null.
  • Para obtener más información acerca de las propiedades de cliente soportadas que se pueden utilizar en el cliente de JAX-RS 2.0, consulte el tema Configuración del cliente de JAX-RS 2.0.
  • Si quiere utilizar la función de Secure Sockets Layer (SSL) en JAX-RS 2.0, realice los pasos siguientes:
    1. Configure las propiedades SSL de la consola de administración de WebSphere Application Server tradicional.

      Para obtener más información, consulte Creación de configuraciones de Capa de sockets seguros.

    2. Habilite la seguridad para la aplicación JAX-RS y configure la aplicación para utilizar un canal SSL para el transporte cuando se invoquen recursos REST.

      Durante el desarrollo o el despliegue de aplicaciones, edite el archivo web.xml para añadir una restricción de seguridad que exija el uso de SSL para sus recursos. Consulte la información sobre la protección de aplicaciones JAX-RS dentro del contenedor web para obtener más detalles sobre la habilitación de SSL para la aplicación.

      El elemento siguiente incluido en el elemento security-constraint especifica que se aplique SSL a la aplicación:
      <user-data-constraint id="UserDataConstraint_1">
          <transport-guarantee>CONFIDENTIAL</transport-guarantee>
       </user-data-constraint>
    3. Para habilitar el SSL de cliente cuando desarrolla su aplicación de cliente, añada una propiedad de cliente en su código de aplicación de cliente.

      Establezca la clave de la propiedad de cliente en com.ibm.ws.jaxrs.client.ssl.config y su valor en true. Consulte el siguiente fragmento de código como referencia:

      ClientBuilder cb = ClientBuilder.newBuilder();
      cb.property("com.ibm.ws.jaxrs.client.ssl.config", "NodeDefaultSSLSettings");
      Consejo: El valor de la propiedad es igual al alias SSL del servidor que defina. Para obtener más información, vaya a Servidores de aplicación->servidor n, donde n es el número que ha asignado a servidor de aplicaciones.->cadenas de transporte de contenedor web->WCInboundDefaultSecure->canal de entrada de SSL (SSL_2) para seleccionarlo en el campo Configuración SSL.
    4. Despliegue la aplicación de cliente en WebSphere Application Server tradicional utilizando la consola administrativa.
    5. Inicie la aplicación de cliente en la consola administrativa de WebSphere Application Server tradicional.

      Para iniciar la aplicación, vaya a Aplicaciones->Tipos de aplicación->Aplicaciones de empresa de WebSphere->Iniciar.

Nota: Para obtener más información acerca del proceso asíncrono en las API de servidor y cliente, consulte el Capítulo 8 de JSR 339: JAX-RS 2.0: La API Java para los servicios web RESTful (la "Especificación").

Icon that indicates the type of topic Concept topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_jaxrs_behavior
File name: twbs_jaxrs_behavior.html