Liberty-Repository[8.5.5.6 oder höher]

Verhaltensänderungen bei JAX-RS 2.0

Die JAX-RS 2.0-Implementierung weist verschiedene Verhaltensänderungen auf, die dazu führen können, dass sich von JAX-RS 1.1 migrierte Anwendungen in JAX-RS 2.0 anders verhalten oder fehlschlagen.

In der folgenden Liste sind die Unterschiede zwischen JAX-RS 1.1 und JAX-RS 2.0 beschrieben:
  • Wenn eine EJB- oder CDI-Klasse in JAX-RS 1.1 und Jersey eine neue Instanz erstellt und diese Instanz von der JAX-RS-Methode "application.getSingletons()" zurückgegeben wird, wird die zurückgegebene Instanz von der Engine verwendet und die Engine versucht nicht, über den EJB- oder CDI-Container auf die Instanz zuzugreifen. In JAX-RS 2.0 versucht die Engine für dasselbe Szenario, über den EJB- oder CDI-Container auf die Instanz zuzugreifen. Wenn die Instanz zugänglich ist, wird die abgerufene Instanz verwendet. Ist die Instanz nicht zugänglich, wird die von der Methode "getSingletons()" zurückgegebene Instanz verwendet, z. B.:
    @Override
    public SetObject getSingletons() {
        SetObject objs = new HashSetObject();
        objs.add(new CDIInjectResource());
        objs.add(new EJBInjectResource());
        return objs;
    }
  • Die als Drittanbieter-API in JAX-RS 1.1 bereitgestellten jackson-Pakete werden in JAX-RS 2.0 nicht mehr bereitgestellt. Wenn Sie eine org.codehaus.jackson-API in Ihrer Anwendung verwenden möchten, müssen Sie die jackson-Pakete in Ihrer Anwendung komprimieren.
  • Wenn Sie javax.ws.rs.core.Application als Servletnamen in der Datei web.xml angeben, gibt die Methode getClasses im Application-Objekt, das von @Context eingefügt wird, die Ressourcenklassen nicht zurück.
    	<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>
  • Die Spezifikation JAX-RS 2.0 legt fest, dass ein Provider eine Klasse ist, die mindestens eine JAX-RS-Schnittstelle implementiert und die für die automatische Erkennung mit @Provider annotiert werden kann. In dem Szenario, in dem eine Klasse eine @Local-Annotation hat, die auf eine Providerschnittstelle verweist, aber keine POJO-Provider-Schnittstelle implementiert, ist die Klasse kein gültiger Provider. Beispiel:
    @Stateless
    @Local(OneLocalInterfaceMyOtherStuffMessageBodyWriter.class)
    public class OneLocalInterfaceMyOtherStuffProvide
  • Wenn Sie die MessageBodyReader- und MessageBodyWriter-Annotationen @Consumes und @Produces verwenden, gelten für einige unterstützte Medientypen unter Umständen bestimmte Einschränkungen. Verwenden Sie die Methode isReadable oder isWriteable, um den Medientyp zu überprüfen, z. B.:
    @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;
        }
    ...
    }
  • Für die Verarbeitung von Threads können Sie asynchrone Verarbeitung in JAX-RS 2.0 verwenden. Weitere Informationen finden Sie unter Asynchrone Verarbeitung.
  • Die Wink-APIs, die als APIs anderer Anbieter bereitgestellt werden, werden nicht unterstützt. In der folgenden Liste sind unter anderem die nicht unterstützten Wink-APIs beschrieben:
    • org.apache.wink.common.model.atom.AtomEntry. In JAX-RS 2.0 setzt die API Antworten in der Wink-Laufzeitumgebungen ab.
    • org.apache.wink.client.handlers.BasicAuthSecurityHandler. Wenn Sie die Basisauthentifizierung in JAX-RS 2.0 verwenden möchten, sehen Sie sich die folgenden Code-Snippets an:
      1. Verwenden Sie ClientRequestFilter über die JAX-RS 2.0-Standard-Client-API, wie im folgenden Codebeispiel gezeigt:
        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. Registrieren Sie sich bei ClientBuilder:
        ClientBuilder cb = ClientBuilder.newBuilder();
        cb.register(new BasicAuthFilter("user","password"));
    • org.apache.wink.client.handlers.LtpaAuthSecurityHandler. Wenn Sie den LTPA-basierten Sicherheitsclient verwenden möchten, um Downstream-Ressourcen zu sichern, finden Sie unter Nachgeordnete JAX-RS-Ressourcen schützen weitere Informationen hierzu.
    • org.apache.wink.server.internal.providers.exception.EJBAccessExceptionMapper. Diese API wird nicht mehr unterstützt, weil es sich um den in Wink spezifizierten ExceptionMapper handelt. Sie können einen eigenen ExceptionMapper definieren, um die EJBAccessException zuzuordnen.
    • com.ibm.websphere.jaxrs.server.IBMRestFilter. Diese API wird nicht mehr unterstützt, weil sie auf Wink Filter basiert.
  • Weitere Informationen zu den unterstützten Clienteigenschaften, die im JAX-RS 2.0-Client verwendet werden können, finden Sie unter JAX-RS 2.0-Client konfigurieren.
  • Wenn Sie die SSL-Funktion (Secure Sockets Layer) in JAX-RS 2.0 verwenden möchten, führen Sie die folgenden Schritte aus:
    1. Aktivieren Sie das Feature ssl-1.0 oder das Feature appSecurity-2.0. Für die LTPA-Token-Funktion ist das das Feature appSecurity-2.0 erforderlich.
      Anmerkung: Das Feature ssl-1.0 ist ein untergeordnetes Feature des Features appSecurity-2.0. Wenn Sie die Features jaxrsClient-2.0 und ssl-1.0 aktivieren, wird das Feature appSecurity-2.0 automatisch aktiviert.
    2. Aktivieren Sie die Eigenschaft com.ibm.ws.jaxrs.client.ssl.config im JAX-RS 2.0-Client-Code wie folgt:
      ClientBuilder cb = ClientBuilder.newBuilder();
      Client c = cb.build();
      c.property("com.ibm.ws.jaxrs.client.ssl.config", "mySSLConfig"); //mySSLConfig ist die SSL-Referenz-ID in der Liberty-Datei 'server.xml'
      Anmerkung: Diese Eigenschaft kann die Liberty-SSL-Konfiguration an die Geltungsbereiche ClientBuilder, Client und WebTarget binden.
  • Wenn Sie den Wink-Client in der JAX-RS 2.0-Serverlaufzeitumgebung verwenden möchten, führen Sie die folgenden Schritte aus:
    1. Anmerkung: Wenn das JAX-RS 2.0-Feature nicht aktiviert ist, müssen Sie auch die JAX-RS-API herunterladen und der Drittanbieterbibliothek hinzufügen. Laden Sie die API von https://jax-rs-spec.java.net/nonav/ herunter.
    2. Speichern Sie alle JAR-Dateien im Verzeichnis <Drittanbieterbibliothek>.
    3. Fügen Sie die Position von <Drittanbieterbibliothek> zur Datei server.xml hinzu:
      <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> 
Anmerkung: Weitere Informationen zur asynchronen Verarbeitung in Client- und Server-APIs finden Sie in Kapitel 8 von JSR 339: JAX-RS 2.0: The Java API for RESTful Web Services (die "Spezifikation").

Symbol das den Typ des Artikels anzeigt. Konzeptartikel

Nutzungsbedingungen für Information Center | Feedback


Symbol für Zeitmarke Letzte Aktualisierung: 25.08.2015
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=phil&product=was-libcore-mp&topic=cwlp_jaxrs_behavior
Dateiname: cwlp_jaxrs_behavior.html