
![[8.5.5.6 ou ultérieure]](../ng_v8556.gif)
Modifications du comportement de JAX-RS 2.0
L'implémentation de JAX-RS 2.0 inclut des modifications de comportement. Par conséquent, des applications qui sont migrées depuis JAX-RS 1.1 peuvent se comporter différemment ou échouer dans JAX-RS 2.0.
Les différences entre JAX-RS 1.1 et JAX-RS 2.0
sont les suivantes :
- Dans JAX-RS 1.1 et Jersey, si une classe EJB ou CDI crée une
nouvelle instance et que celle-ci est retournée par la méthode
JAX-RS application.getSingletons(), l'instance retournée est
utilisée par le moteur, lequel n'essaie pas d'accéder à l'instance
depuis le conteneur EJB ou CDI. Dans JAX-RS 2.0, dans ce même
scénario, le moteur essaie d'accéder à l'instance depuis le conteneur
EJB ou CDI.
Si l'instance est accessible, l'instance extraite est utilisée. Dans
le cas contraire, l'instance retournée par la méthode
getSingletons() est utilisée. Exemple :
@Override public SetObject getSingletons() { SetObject objs = new HashSetObject(); objs.add(new CDIInjectResource()); objs.add(new EJBInjectResource()); return objs; }
- Les packages jackson qui sont exposés en tant qu'API tierce dans JAX-RS 1.1 ne sont plus exposés dans JAX-RS 2.0. Si vous voulez utiliser des API org.codehaus.jackson dans votre application, vous devez compresser les packages jackson dans votre application.
- Si vous indiquez
javax.ws.rs.core.Application comme nom de
servlet dans le fichier web.xml,
la méthode
getClasses de l'objet Application, qui est
injectée par @Context, ne renvoie pas les classes
de ressource.
<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>
- D'après la spécification JAX-RS 2.0, un fournisseur
est
une classe qui implémente une ou plusieurs interfaces JAX-RS et qui
peut être annotée avec @Provider pour la
reconnaissance automatique.
Dans le cas où une classe
comporte
l'annotation @Local qui fait référence à une
interface de fournisseur, mais qu'elle n'implémente pas d'interface
de fournisseur POJO, il s'agit alors d'un fournisseur non valide.
Exemple :
@Stateless @Local(OneLocalInterfaceMyOtherStuffMessageBodyWriter.class) public class OneLocalInterfaceMyOtherStuffProvide
- Si vous utilisez les annotations @Consumes et
@Produces de MessageBodyReader
et MessageBodyWriter, certains types de support pris en
charge peuvent être restreints. Utilisez les méthodes
isReadable ou isWriteable
pour vérifier le type de support. Exemple :
@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; } ... }
- Vous pouvez utiliser le traitement asynchrone dans JAX-RS 2.0 pour traiter les unités d'exécution. Pour plus d'informations, voir Traitement asynchrone.
- Aucune des API Wink exposées en tant qu'API tierces n'est prise
en charge. La liste suivante
décrit (y compris et sans restriction) les API Wink qui ne sont
pas prises en charge :
- org.apache.wink.common.model.atom.AtomEntry. Dans JAX-RS 2.0, l'API répond dans l'environnement d'exécution Wink.
- org.apache.wink.client.handlers.BasicAuthSecurityHandler. Si vous voulez utiliser l'authentification de base dans JAX-RS 2.0,
consulter les fragments de code suivants :
- Utilisez ClientRequestFilter via l'API JAX-RS 2.0 client
standard comme illustré dans l'exemple de code :
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); } }
- Enregistrez dans
ClientBuilder :
ClientBuilder cb = ClientBuilder.newBuilder(); cb.register(new BasicAuthFilter("user","password"));
- Utilisez ClientRequestFilter via l'API JAX-RS 2.0 client
standard comme illustré dans l'exemple de code :
- org.apache.wink.client.handlers.LtpaAuthSecurityHandler. Si vous voulez utiliser le client de sécurité basé sur LTPA pour sécuriser les ressources en aval, voir Sécurisation des ressources JAX-RS en aval.
- org.apache.wink.server.internal.providers.exception.EJBAccessExceptionMapper. Cette API n'est plus prise en charge car il s'agit d'une exception spécifiée par Wink. Vous pouvez définir votre élément ExceptionMapper pour mapper l'élément EJBAccessException.
- com.ibm.websphere.jaxrs.server.IBMRestFilter. Cette API n'est plus prise en charge car elle est basée sur un filtre Wink.
- Pour plus d'informations sur les propriétés client prises en charge qui peuvent être utilisées dans le client JAX-RS 2.0, voir Configuration du client JAX-RS 2.0.
- Si vous voulez utiliser la fonction Secure Sockets
Layer (SSL) dans JAX-RS 2.0, procédez comme suit :
- Activez la fonction ssl-1.0 ou la fonction
appSecurity-2.0. Pour la fonction de jeton
LTPA, la fonction appSecurity-2.0 est
obligatoire.Remarque : La fonction ssl-1.0 est une sous-fonction de la fonction appSecurity-2.0. Si vous activez les fonctions jaxrsClient-2.0 et ssl-1.0, la fonction appSecurity-2.0 est automatiquement activée.
- Activez la propriété
com.ibm.ws.jaxrs.client.ssl.config
dans le code client de JAX-RS 2.0 comme suit :
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
Remarque : Cette propriété peut lier la propriété SSL Liberty aux portées de ClientBuilder, Client et WebTarget.
- Activez la fonction ssl-1.0 ou la fonction
appSecurity-2.0. Pour la fonction de jeton
LTPA, la fonction appSecurity-2.0 est
obligatoire.
- Si vous voulez utiliser Wink Client sur le serveur JAX-RS 2.0,
procédez comme suit :
- Téléchargez les fichiers Apache Wink et les fichiers JAR associés depuis http://wink.apache.org/downloads.html.
- Téléchargez les fichiers Apache HTTP et les fichiers JAR associés depuis http://hc.apache.org/.
Remarque : Si la fonction JAX-RS 2.0 n'est pas activée, vous devez aussi télécharger et ajouter l'API JAX-RS à la bibliothèque tierce. Téléchargez l'API depuis https://jax-rs-spec.java.net/nonav/.- Sauvegardez tous les fichiers JAR dans le répertoire <third-party lib>.
- Ajoutez l'emplacement de <third-party
lib> dans le fichier 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>
Remarque : Pour plus d'informations sur le traitement asynchrone dans les API
Client et Server, consultez le chapitre 8 du manuel
JSR
339: JAX-RS 2.0: The Java API for RESTful Web Services (la
"Spécification").