Verhaltensänderungen bei JAX-RS 2.0
Ab Version 9 unterstützt Liberty JAX-RS 2.0. Bevor Sie JAX-RS in Liberty verwenden, müssen Sie die folgenden Unterschiede zwischen JAX-RS 1.1 und JAX-RS 2.0 kennen.
Im Folgenden sind die Unteschiede zwischen JAX-RS 1.1 und JAX-RS 2.0 in Liberty 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 Set<Object> getSingletons() { Set<Object> objs = new HashSet<Object>(); 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.
Für JAX-RS 2.0 in Liberty gilt Folgendes:
- 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 Jackson-Annotationen in Java-Objekten mit JAX-RS 2.0 bearbeiten möchten, müssen Sie getSingletons() in Ihrer Anwendungsklasse überschreiben, damit JSON-Provider von Jackson zurückgegeben wird.
@Override public Set<Object> getSingletons() { Set<Object> singletons = new HashSet<Object>(); singletons.add(new JacksonJaxbJsonProvider()); return singletons; }
- 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 möglicherweise 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; } ... }
- Sie können das asynchrone Verarbeitungsverfahren in JAX-RS 2.0 verwenden, um Threads zu verarbeiten. 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 Ressource für den Empfang von Abschnitten mit mehrteiligen Formulardaten aus einem HTML-Übergabeformular in JAX-RS 2.0 konfigurieren 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.
- Informationen zur unterstützten Clienteigenschaft, die im JAX-RS 2.0-Client verwendet werden kann, finden Sie unter JAX-RS 2.0-Client konfigurieren.
- Wenn Sie in JAX-RS 2.0 die SSL-Funktion
(Secure Sockets Layer) verwenden möchten, müssen Sie das Feature
ssl-1.0 oder appSecurity-2.0 aktivieren. Für die LTPA-Tokenfunktion ist das Feature appSecurity-2.0 erforderlich. Anmerkung: Das Feature ssl-1.0 ist ein untergeordnetes Feature des Features appSecurity-2.0. Wenn Sie das Feature jaxrsClient-2.0 und das Feature ssl-1.0 aktivieren, wird das Feature appSecurity-2.0 automatisch aktiviert.
- 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").