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 hacer que las aplicaciones tuvieran un comportamiento distinto o fallaran 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 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 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, @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.
- Los paquetes jackson que se visualizan como API de terceros en JAX-RS 1.1 ya no se visualizan 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 como el nombre de servlet en el archivo web.xml, el método getClasses del objeto de aplicación, el cual inyecta @Context, no devuelve las clases de recursos.
<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 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 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. 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:
- 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 Protección de recursos JAX-RS en sentido descendente.
- 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.
- 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 desea utilizar la función SSL (Secure Sockets Layer) en JAX-RS 2.0, realice los pasos siguientes:
- Habilite la característica ssl-1.0 o appSecurity-2.0. Para la función de señal LTPA, se requiere 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 las características jaxrsClient-2.0 y ssl-1.0, automáticamente se habilita la característica appSecurity-2.0.
- Habilite la propiedad com.ibm.ws.jaxrs.client.ssl.config en el código de cliente de JAX-RS 2.0 de este modo:
ClientBuilder cb = ClientBuilder.newBuilder(); Client c = cb.build(); c.property("com.ibm.ws.jaxrs.client.ssl.config", "mySSLConfig"); //mySSLConfig is the ssl ref id in Liberty server.xml
Nota: Esta propiedad puede enlazar la configuración SSL de Liberty a los ámbitos de ClientBuilder, Client y WebTarget.
- Habilite la característica ssl-1.0 o appSecurity-2.0. Para la función de señal LTPA, se requiere la característica appSecurity-2.0.
- 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 <third-party lib>.
- Añada la ubicación <third-party lib> al archivo server.xml:
<library id="thirdPartyLib"> <fileset dir=" <third-party lib>" includes="*.jar" scanInterval="5s"/> </library> <enterpriseApplication id="<Your Ear ID>" location="<Your Ear Name>" name="<Your Ear Name>"> <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: 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").