Modifications du comportement de JAX-RS 2.0
A partir de la version 9, Liberty prend en charge JAX-RS 2.0. Avant de commencer à utiliser JAX-RS dans Liberty, il peut vous être utile de connaître les différences suivantes entre JAX-RS 1.1 et JAX-RS 2.0.
Les différences entre JAX-RS
1.1 et JAX-RS 2.0 dans Liberty sont les suivantes :
- Dans JAX-RS 1.1 et Jersey, si une classe EJB ou CDI crée une
nouvelle instance qui est retournée par la méthode JAX-RS
application.getSingletons(), le moteur utilise l'instance
retournée et n'essaie pas d'accéder à l'instance du 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 Set<Object> getSingletons() { Set<Object> objs = new HashSet<Object>(); objs.add(new CDIInjectResource()); objs.add(new EJBInjectResource()); return objs; }
- JAX-RS 2.0 inclut de nombreuses modifications d'API lorsqu'il traite le fichier à plusieurs parties. Par exemple, dans JAX-RS 1.1, @FormParam peut être utilisé pour traiter le fichier à plusieurs parties, mais dans JAX-RS 2.0, seul @IMultipartBody ou @IAttachment peut être utilisé pour traiter le fichier à plusieurs parties. Pour plus d'informations, voir Configuration d'une ressource pour la réception d'éléments multipart/form-data depuis une soumission de formulaire HTML dans JAX-RS 2.0.
Les éléments suivants concernant
JAX-RS 2.0 dans Liberty :
- Les packages Jackson affichés en tant qu'API tierce dans JAX-RS 1.1 ne sont plus exposés dans JAX-RS 2.0. Si vous désirez utiliser une API org.codehaus.jackson dans votre
application, vous devez compresser les packages Jackson dans votre application. Pour gérer les annotations Jackson dans un objet Java avec
JAX-RS 2.0, vous devez redéfinir getSingletons() dans votre classe d'application afin de renvoyer le fournisseur JSON de Jackson.
@Override public Set<Object> getSingletons() { Set<Object> singletons = new HashSet<Object>(); singletons.add(new JacksonJaxbJsonProvider()); return singletons; }
- Si vous indiquez javax.ws.rs.core.Application comme nom de servlet dans le fichier web.xml, il se peut que la méthode
getClasses dans l'objet Application, qui est injecté 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 ce scénario, une classe comporte
une annotation @Local qui fait référence à une
interface de fournisseur, mais qui n'implémente aucune interface de
fournisseur POJO, et il s'agit 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 la technique de 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 qui sont affichées en tant qu'API tierces
dans JAX-RS 1.1 n'est prise en charge dans JAX-RS 2.0. Voici une
liste partielle :
- org.apache.wink.common.model.atom.AtomEntry. Pour plus d'informations sur l'intégration de JAX-RS 2.0 à Atom, voir Intégration de JAX-RS 2.0 à Atom.
- 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 Configuration d'une ressource pour la réception de composants de données de formulaire/multiple à partir d'une soumission de formulaire HTML dans JAX-RS 2.0.
- 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.
Remarque : Détectez si des packages wink jar figurent dans votre application. Si tel est le cas, vous devez procéder comme suit :- Assurez-vous qu'une sous-classe Application est définie.
- Au moins l'une des classes getClasses et getSingletons ne doit pas retourner NULL.
- Pour plus d'informations sur la propriété client prise en charge pouvant être utilisée dans le client JAX-RS 2.0, voir Configuration du client JAX-RS 2.0.
- Si vous voulez utiliser la fonctionnalité Secure Sockets Layer (SSL)
dans JAX-RS 2.0, vous devez activer la fonction ssl-1.0 ou
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 la fonction jaxrsClient-2.0 et la fonction ssl-1.0, la fonction appSecurity-2.0 est activée automatiquement.
- Si vous voulez utiliser Wink Client sur le serveur JAX-RS 2.0,
procédez comme suit :
- Téléchargez les fichiers ci-après pour activer le
client Wink dans l'environnement d'exécution de serveur
JAX-RS 2.0.
- 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 JAX-RS 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> au 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>
- Téléchargez les fichiers ci-après pour activer le
client Wink dans l'environnement d'exécution de serveur
JAX-RS 2.0.
Remarque : Pour en savoir plus sur le traitement asynchrone dans les API Client et Serveur, voir le chapitre 8 de
JSR 339: JAX-RS 2.0: The Java API for RESTful Web Services (la
"Spécification").