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:
- 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); } }
- Registre en ClientBuilder:
ClientBuilder cb = ClientBuilder.newBuilder(); cb.register(new BasicAuthFilter("user","password"));
- Utilice ClientRequestFilter en la API de cliente estándar de JAX-RS 2.0 como se muestra en el ejemplo de código:
- 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:- Asegúrese de que haya una subclase de aplicación definida.
- 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:
- Descargue los archivos siguientes que pueden habilitar Wink Client en el tiempo de ejecución del servidor de
JAX-RS 2.0.
- Descargue Apache Wink y los archivos JAR relacionados desde http://wink.apache.org/downloads.html.
- Descargue Apache HTTP y los archivos JAR relacionados desde http://hc.apache.org/.
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/. - Guarde todos los archivos JAR en el directorio <biblioteca de tercerios>.
- 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>
- Descargue los archivos siguientes que pueden habilitar Wink Client en el tiempo de ejecución del servidor de
JAX-RS 2.0.
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").