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 SetObject getSingletons() {
        SetObject objs = new HashSetObject();
        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.
  • 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 :
      1. 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);
            }
        }
      2. Enregistrez dans ClientBuilder :
        ClientBuilder cb = ClientBuilder.newBuilder();
        cb.register(new BasicAuthFilter("user","password"));
    • 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 :
    1. Assurez-vous qu'une sous-classe Application est définie.
    2. 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 :
    1. 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 : 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/.
    2. Sauvegardez tous les fichiers JAR dans le répertoire <third-party lib>.
    3. 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").

Icône indiquant le type de rubrique Rubrique de concept



Icône d'horodatage Dernière mise à jour: Tuesday, 6 December 2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=cwlp_jaxrs_behavior
Nom du fichier : cwlp_jaxrs_behavior.html