Verhaltensänderungen bei JAX-RS 2.0
Die JAX-RS 2.0-Implementierung weist einige Verhaltensänderungen auf. Diese Änderungen können dazu führen, dass sich Anwendungen in JAX-RS 2.0 anders verhalten oder Fehler erzeugen, wenn ein Upgrade der Anwendungen von JAX-RS 1.1 durchgeführt wird.
In der folgenden Liste sind die Unterschiede zwischen JAX-RS 1.1 und JAX-RS 2.0 beschrieben:
- Wenn in JAX-RS 1.1 und Jersey eine EJB- oder CDI-Klasse eine neue Instanz erstellt,
die von der JAX-RS-Methode "application.getSingletons()"
zurückgegeben wird, verwendet die Engine die zurückgegebene Instanz und 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. Kann auf die Instanz aber nicht zugegriffen werden,
wird die von der Methode "getSingletons()" zurückgegebene Instanz
verwendet. Beispiel:
@Override public SetObject getSingletons() { SetObject objs = new HashSetObject(); objs.add(new CDIInjectResource()); objs.add(new EJBInjectResource()); return objs; }
JAX-RS 2.0 weist viele API-Änderungen bei der Bearbeitung der MultiPart-Datei auf. In JAX-RS 1.1 kann @FormParam verwendet werden, um die MultiPart-Datei zu bearbeiten, aber in JAX-RS 2.0 kann dafür nur @IMultipartBody oder @IAttachment verwendet werden. Weitere Informationen finden Sie unter Ressource für den Empfang mehrteiliger Formulardaten aus einem HTML-Übergabeformular in JAX-RS 2.0 konfigurieren.
- Die als Drittanbieter-API in JAX-RS 1.1 angezeigten jackson-Pakete werden in JAX-RS 2.0 nicht mehr angezeigt. 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 für den 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.
Im Szenario hat eine Klasse eine @Local-Annotation, die auf eine Providerschnittstelle verweist, aber keine
POJO-Provider-Schnittstelle implementiert. Die Klasse ist also 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 die Methode isWriteable, um den Medientyp zu überprüfen, z. B.:
Beispiel:
@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 im Artikel Asynchrone Verarbeitung.
- Die Wink-APIs, die als APIs anderer Anbieter in JAX-RS 1.1 angezeigt werden, werden in JAX-RS 2.0 nicht unterstützt. Im Folgenden finden Sie eine
Teilliste:
- org.apache.wink.common.model.atom.AtomEntry. Weitere Informationen zum Integrieren von JAX-RS 2.0 mit Atom finden Sie unter JAX-RS 2.0-Integration mit Atom.
- 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:
- 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); } }
- Registrieren Sie sich bei ClientBuilder:
ClientBuilder cb = ClientBuilder.newBuilder(); cb.register(new BasicAuthFilter("user","password"));
- Verwenden Sie ClientRequestFilter über die JAX-RS 2.0-Standard-Client-API, wie im folgenden Codebeispiel gezeigt:
- 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.
Anmerkung:Ermitteln Sie, ob Ihre Anwendung Wink-JAR-Pakete enthält. Wenn Ihre Anwendung Wink-Pakete enthält, müssen Sie die folgenden Schritte ausführen:
- Vergewissern Sie sich, dass die Application-Unterklasse definiert ist.
- getClasses und/oder getSingletons darf nicht null zurückgeben.
- 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:
- Aktivieren Sie das Feature ssl-1.0 oder das Feature appSecurity-2.0.
Für die LTPA-Token-Funktion ist 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.
- 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.
- Aktivieren Sie das Feature ssl-1.0 oder das Feature appSecurity-2.0.
Für die LTPA-Token-Funktion ist das Feature appSecurity-2.0 erforderlich.
- Wenn Sie den Wink-Client in der JAX-RS 2.0-Serverlaufzeitumgebung verwenden möchten, führen Sie die folgenden Schritte aus:
- Laden Sie die folgenden Dateien herunter, die den Wink-Client in der
JAX-RS 2.0-Serverlaufzeitumgebung aktivieren können.
- Laden Sie Apache Wink und die zugehörigen JAR-Dateien von http://wink.apache.org/downloads.html herunter.
- Laden Sie Apache HTTP und die zugehörigen JAR-Dateien von http://hc.apache.org/ herunter.
Anmerkung: Wenn das JAX-RS 2.0-Feature nicht aktiviert ist, müssen Sie außerdem die JAX-RS-API herunterladen und der Drittanbieterbibliothek hinzufügen. Laden Sie die JAX-RS-API von https://jax-rs-spec.java.net/nonav/ herunter. - Speichern Sie alle JAR-Dateien im Verzeichnis <third-party lib>.
- Fügen Sie die Position von <third-party lib> der 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>
- Laden Sie die folgenden Dateien herunter, die den Wink-Client in der
JAX-RS 2.0-Serverlaufzeitumgebung aktivieren können.
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 (der "Spezifikation").