Cambios del comportamiento de JAX-RS 2.0

A partir de la versión 9, Liberty da soporte a JAX-RS 2.0. Antes de empezar a utilizar JAX-RS en Liberty, es posible que tenga que saber las diferencias siguientes entre JAX-RS 1.1 y JAX-RS 2.0.

Los elementos siguientes constituyen las diferencias entre JAX-RS 1.1 y JAX-RS 2.0 en Liberty:
  • En JAX-RS 1.1 y Jersey, si una clase EJB o CDI crea una instancia nueva que el método application.getSingletons() de JAX-RS devuelve, el motor utiliza la instancia devuelta y no intenta acceder a la instancia desde el contenedor EJB o 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. Sin embargo, si no se puede acceder a la instancia, se utiliza la instancia devuelta del método getSingletons(). Por ejemplo:
    @Override
    public Set<Object> getSingletons() {
        Set<Object> objs = new HashSet<Object>();
        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, @FormParam se puede utilizar para manejar el archivo MultiPart, pero en JAX-RS 2.0 solo se puede utilizar @IMultipartBody o @IAttachment para manejar el archivo MultiPart. Para obtener más información, consulte Configuración de un recurso para recibir partes multipart/form-data de un envío de formulario HTML en JAX-RS 2.0.
Se aplican los elementos siguientes a JAX-RS 2.0 en Liberty:
  • Los paquetes Jackson como API de terceros en JAX-RS 1.1 ya no están expuestos en JAX-RS 2.0. Si desea utilizar cualquier API org.codehaus.jackson en la aplicación, debe comprimir paquetes Jackson en la aplicación. Para manejar las anotaciones de Jackson en el objeto Java con JAX-RS 2.0, hay que sustituir getSingletons() en la clase de aplicación para devolver el proveedor JSON de Jackson.
    @Override
    public Set<Object> getSingletons() {
        Set<Object> singletons = new HashSet<Object>();
        singletons.add(new JacksonJaxbJsonProvider());
        return singletons;
    }
  • Si especifica javax.ws.rs.core.Application como el nombre de servlet en el archivo web.xml, el método getClasses en el objeto de aplicación, que se inyecta mediante @Context, podría no devolver 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 el caso de uso en que una clase tiene una anotación @Local que hace referencia a una interfaz de proveedor, pero no implementa ninguna interfaz de proveedor POJO, se trata de un proveedor no 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 los métodos 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 la técnica de 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 Wink que se visualizan como API de terceros en JAX-RS 1.1 están soportadas en JAX-RS 2.0. A continuación se muestra una lista parcial:
    • org.apache.wink.common.model.atom.AtomEntry. Si desea más información sobre cómo integrar 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 Configuración de un recurso para recibir partes de datos de diversos formularios o de diversas partes del envío de un formulario HTML en JAX-RS 2.0.
    • 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: Detecte si hay paquetes jar wink en la aplicación. Si hay paquetes wink en la aplicación, debe realizar los pasos siguientes:
    1. Asegúrese de que haya una subclase de aplicación definida.
    2. Al menos uno de getClasses y getSingletons no debe devolver nulo.
  • Si desea ver la propiedad de cliente soportado que se puede utilizar en el cliente JAX-RS 2.0, consulte Configuración del cliente JAX-RS 2.0.
  • Si desea utilizar la función SSL (Secure Sockets Layer) en JAX-RS 2.0, tendrá que habilitar la característica ssl-1.0 o appSecurity-2.0. Para la función de señal LTPA, es necesaria la característica appSecurity-2.0.
    Nota: La característica ssl-1.0 es una subcaracterística de la característica appSecurity-2.0. Si habilita la característica jaxrsClient-2.0 y la característica ssl-1.0, la característica appSecurity-2.0 se habilita automáticamente.
  • Si desea utilizar Wink Client en el tiempo de ejecución del servidor de JAX-RS 2.0, realice los pasos siguientes:
    1. Descargue los archivos siguientes que pueden habilitar Wink Client en el tiempo de ejecución del servidor de JAX-RS 2.0.
      Nota: Si no está habilitada la característica JAX-RS 2.0, también debe descargarla y añadir la API de JAX-RS a la biblioteca de terceros. Descargue la API de JAX-RS desde https://jax-rs-spec.java.net/nonav/.
    2. Guarde todos los archivos JAR en el directorio <biblioteca de tercerios>.
    3. Añada la ubicación <biblioteca de terceros> al archivo server.xml:
      <library id="thirdPartyLib">
        <fileset dir=" <third-party lib>" includes="*.jar" scanInterval="5s"/>
      </library>
      <enterpriseApplication id="<ID Del EAR>" location="<Nombre del EAR>" name="<Nombre del EAR>">
        <classloader commonLibraryRef="thirdPartyLib"/>
      </enterpriseApplication>
Nota: Si desea más información sobre el proceso asíncrono en las API cliente y servidor, consulte el Capítulo 8 de JSR 339: JAX-RS 2.0: La API Java para servicios web RESTful (la "Especificación").

Icono que indica el tipo de tema Tema de concepto

Nombre de archivo: cwlp_jaxrs_behavior.html