Verhaltensänderungen in JAX-RS 2.0
Die JAX-RS 2.0-Implementierung beinhaltet einige Verhaltensänderungen. Diese Änderungen führen möglicherweise dazu, dass Anwendungen in JAX-RS 2.0 ein anderes Verhalten aufweisen oder fehlschlagen, wenn ein Upgrade der Anwendungen von JAX-RS 1.1 durchgeführt wird.
- 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 demselben Szenario in JAX-RS 2.0 versucht die Engine, über den EJB- oder CDI-Container auf die Instanz zuzugreifen.
Wenn auf die Instanz zugegriffen werden kann, wird die abgerufene Instanz verwendet.
Kann jedoch nicht auf die Instanz 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 beinhaltet zahlreiche API-Änderungen bezüglich der Behandlung der MultiPart-Datei. In JAX-RS 1.1 kann @FormParam beispielsweise für die Behandlung der MultiPart-Datei verwendet werden. In JAX-RS 2.0 hingegen kann nur @IMultipartBody oder @IAttachment zur Behandlung der MultiPart-Datei verwendet werden. Weitere Informationen finden Sie unter Ressource für den Empfang von Abschnitten mit mehrteiligen Formulardaten aus einem HTML-Übergabeformular in JAX-RS 2.0 konfigurieren.
- Die in JAX-RS 1.1 als API eines anderen Anbieters angezeigten Jackson-Pakete werden in JAX-RS 2.0 nicht mehr angezeigt. Wenn Sie org.codehaus.jackson-APIs 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 Objekt "Application" (das mit @Context injiziert wird) die Ressourcenklasse 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>
- In der Spezifikation JAX-RS 2.0 ist angegeben, dass ein Provider eine Klasse ist, die eine oder mehrere
JAX-RS-Schnittstellen implementiert und mit der Annotation @Provider für die automatische Erkennung versehen werden kann.
Im Szenario hat eine Klasse die Annotation @Local, die sich auf eine Providerschnittstelle bezieht,
implementiert aber keine POJO-Providerschnittstelle und ist somit ein ungültiger Provider. Beispiel:
@Stateless @Local(OneLocalInterfaceMyOtherStuffMessageBodyWriter.class) public class OneLocalInterfaceMyOtherStuffProvide
- Wenn Sie die MessageBodyReader- und MessageBodyWriter-Annotationen @Consumes und
@Produces verwenden, wird die Unterstützung einiger Medientypen eingeschränkt. Verwenden Sie die Methode
isReadable oder die Methode isWriteable, um den Medientyp zu überprüfen.
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; } ... }
- In JAX-RS 2.0 können Sie die asynchrone Verarbeitung für die Verarbeitung von Threads verwenden. Weitere Informationen hierzu finden Sie im Artikel Asynchrone Verarbeitung.
- Keine der Wink-APIs, die als APIs anderer Anbieter in JAX-RS 1.1 angezeigt werden, werden in
JAX-RS 2.0 unterstützt. Im Folgenden finden Sie die Teilliste:
- org.apache.wink.common.model.atom.AtomEntry. Weitere Informationen zur Integration von JAX-RS 2.0 mit Atom finden Sie unter JAX-RS 2.0 mit Atom integrieren.
- org.apache.wink.client.handlers.BasicAuthSecurityHandler. Wenn Sie die Basisauthentifizierung
in JAX-RS 2.0 verwenden möchten, schauen Sie sich die folgenden Code-Snippets an:
- Verwenden Sie ClientRequestFilter wie im folgenden Codebeispiel über die JAX-RS 2.0-Standardclient-API:
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); } }
- Führen Sie eine Registrierung bei
ClientBuilder durch:
ClientBuilder cb = ClientBuilder.newBuilder(); cb.register(new BasicAuthFilter("user","password"));
- Verwenden Sie ClientRequestFilter wie im folgenden Codebeispiel über die JAX-RS 2.0-Standardclient-API:
- org.apache.wink.client.handlers.LtpaAuthSecurityHandler. Wenn Sie den LTPA-basierten Sicherheitsclient verwenden möchten, um nachgeschaltete Ressourcen zu sichern, lesen Sie die Informationen im Artikel Nachgeschaltete (Downstream-)JAX-RS-Ressourcen sichern.
- org.apache.wink.server.internal.providers.exception.EJBAccessExceptionMapper. Diese API wird nicht mehr unterstützt, weil es sich um den Wink-spezifischen Ausführungsmapper (ExceptionMapper) handelt. Sie können einen eigenen ExceptionMapper definieren, um die Ausnahme "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 eine Anwendungsunterklasse 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 im Artikel 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:
- Konfigurieren Sie die SSL-Eigenschaften in der WebSphere Application Server Traditional-Administrationskonsole.
Weitere Informationen hierzu finden Sie im Artikel SSL-Konfiguration erstellen.
- Aktivieren Sie die Sicherheit für Ihre JAX-RS-Anwendung, und konfigurieren
Sie Ihre Anwendung so, dass ein SSL-Kanal für Transporte verwendet wird, wenn REST-Ressourcen aufgerufen werden.
Wenn Sie Anwendungen entwickeln oder implementieren, bearbeiten Sie die die Datei web.xml und fügen eine Integritätsbedingung für die Sicherheit hinzu, die die Verwendung von SSL für Ihre Ressourcen voraussetzt. Weitere Einzelheiten zum Aktivieren von SSL für Ihre Anwendung finden Sie in dem Artikel, der beschreibt, wie JAX-RS-Anwendungen im Web-Container geschützt werden.
Das folgende Element innerhalb des Elements "security-constraint" gibt an, dass SSL für die Anwendung verwendet werden soll:<user-data-constraint id="UserDataConstraint_1"> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint>
- Wenn Sie Ihre Clientanwendung entwickeln, können Sie Client-SSL aktivieren,
indem Sie eine Clienteigenschaft in Ihren Clientanwendungscode aufnehmen.
Setzen Sie den Clienteigenschaftsschlüssel auf com.ibm.ws.jaxrs.client.ssl.config und dessen Wert auf "true". Verwenden sie das folgende Code-Snippet als Referenz:
ClientBuilder cb = ClientBuilder.newBuilder(); cb.property("com.ibm.ws.jaxrs.client.ssl.config", "NodeDefaultSSLSettings");
Tipp: Der Eigenschaftswert entspricht dem Server-SSL-Alias, den Sie festgelegt haben. Sie können diese Angabe unter Anwendungsserver->Server n (wobei n die dem Anwendungsserver zugewiesene Nummer ist) ->Transportketten für Web-Container->WCInboundDefaultSecure->SSL-Kanal für eingehende Anforderungen (SSL_2) im Feld SSL-Konfiguration abrufen. - Verwenden Sie die Administrationskonsole, um Ihre Clientanwendung in WebSphere Application Server Traditional zu implementieren.
- Starten Sie die Clientanwendung in der WebSphere Application Server Traditional-Administrationskonsole.
Zum Starten der Anwendung navigieren Sie zu Anwendungen->Anwendungstypen->WebSphere-Unternehmensanwendungen->Starten.
- Konfigurieren Sie die SSL-Eigenschaften in der WebSphere Application Server Traditional-Administrationskonsole.