
![[8.5.5.6 o posterior]](../ng_v8556.gif)
Cambios del comportamiento de JAX-RS 2.0
La implementación de JAX-RS 2.0 contiene algunos cambios de comportamiento que pueden hacer que las aplicaciones que se han migrado desde JAX-RS 1.1 se comporten de forma diferente o fallen en JAX-RS 2.0.
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 y el método application.getSingletons() de JAX-RS devuelve esta
instancia, el motor utiliza la instancia devuelta y el motor no intenta acceder a la instancia del 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, entonces se utiliza la instancia recuperada. Si no se puede acceder a la instancia, se utiliza la instancia recuperada por el método getSingletons(). Por ejemplo:
@Override public SetObject getSingletons() { SetObject objs = new HashSetObject(); objs.add(new CDIInjectResource()); objs.add(new EJBInjectResource()); return objs; }
- Los paquetes jackson expuestos a una API de terceros en JAX-RS 1.1 ya no están expuestos 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 exponen como API de terceros está soportada. La siguiente lista describe las API Wink no soportadas, pero sin limitarse a las mismas:
- org.apache.wink.common.model.atom.AtomEntry. En JAX-RS 2.0, la API responde en el tiempo de ejecución de Wink.
- 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.
- 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, siga estos pasos:
- 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, siga estos pasos:
- 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 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>
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").