Kapitel 5. Änderungen bei Applikationsmigration
5.1. Änderungen der Webservices-Applikation
JBossWS 5 bringt neue Funktionalitäten und Performance-Verbesserungen in JBoss EAP 7 Webservices ein, hauptsächlich aufgrund von Upgrades der Komponenten Apache CXF, Apache WSS4J und Apache Santuario.
5.1.1. Änderungen der JAX-RPC-Unterstützung
Die Java-API für XML-basierte RPC (JAX-RPC) gilt seit Java EE 6 als veraltet und ist in Java EE 7 optional. In JBoss EAP 7 ist sie nicht mehr verfügbar und wird nicht mehr unterstützt. Applikationen, die JAX-RPC verwenden, müssen zu JAX-WS migriert werden, dem aktuellen Java EE Standard Webservices-Framework.
Auf die Verwendung von JAX-RPC Webservices kann eine der folgenden Tatsachen hinweisen:
-
Das Vorhandensein einer JAX-RPC Mapping-Datei – eine XML-Datei mit dem Root-Element
<java-wsdl-mapping>
. Das Vorhandensein einer
webservices.xml
XML-Deskriptordatei, die ein<webservice-description>
-Element enthält, das ein<jaxrpc-mapping-file>
-Unterelement enthält. Nachfolgend sehen Sie ein Beispiel für einewebservices.xml
-Deskriptordatei, die einen JAX-RPC Webservice definiert.<webservices xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://www.ibm.com/webservices/xsd/j2ee_web_services_1_1.xsd" version="1.1"> <webservice-description> <webservice-description-name>HelloService</webservice-description-name> <wsdl-file>WEB-INF/wsdl/HelloService.wsdl</wsdl-file> <jaxrpc-mapping-file>WEB-INF/mapping.xml</jaxrpc-mapping-file> <port-component> <port-component-name>Hello</port-component-name> <wsdl-port>HelloPort</wsdl-port> <service-endpoint-interface>org.jboss.chap12.hello.Hello</service-endpoint-interface> <service-impl-bean> <servlet-link>HelloWorldServlet</servlet-link> </service-impl-bean> </port-component> </webservice-description> </webservices>
-
Das Vorhandensein einer
ejb-jar.xml
-Datei, die ein<service-ref>
enthält, das eine JAX-RPC Mapping-Datei referenziert.
5.1.2. Änderungen der Apache CXF Spring Webservices
In früheren Releases von JBoss EAP konnten Sie die Integration von JBossWS und Apache CXF anpassen, indem Sie eine jbossws-cxf.xml
-Konfigurationsdatei im Endpunkt-Deployment-Archiv implementierten. Ein Anwendungsfall hierfür war die Konfiguration von Interzeptor-Ketten für Webservice-Client- und -Server-Endpunkte auf dem Apache CXF-Bus. Diese Integration erfordert, dass Spring auf dem JBoss EAP Server deployt ist.
Die Spring-Integration wird in JBoss EAP 7 nicht länger unterstützt. Jegliche Applikationen, die eine jbossws-cxf.xml
-Deskriptor-Konfigurationsdatei enthalten, müssen bearbeitet werden, um die angepasste Konfiguration in dieser Datei zu ersetzen. Zwar ist es weiterhin möglich, direkt auf die Apache CXF-API zuzugreifen, seien Sie sich jedoch bewusst, dass die Applikation nicht portierbar sein wird.
Wir empfehlen, wo möglich die angepassten Spring-Konfigurationen durch die neuen JBossWS Deskriptor-Konfigurationsoptionen zu ersetzen. Die JBossWS Deskriptor-basierte Herangehensweise bietet eine ähnliche Funktionalität, ohne Änderungen am Client-Endpunkt-Code zu erfordern. In einigen Fällen können Sie Spring durch Context Dependency Injection (CDI) ersetzen.
Apache CXF-Interzeptoren
Der JBossWS-Deskriptor bietet neue Konfigurationsoptionen, die es Ihnen ermöglichen, die Interzeptoren zu deklarieren, ohne den Client-Endpunkt-Code zu ändern. Stattdessen deklarieren Sie Interzeptoren innerhalb der vordefinierten Client- und Endpunkt-Konfigurationen, indem Sie eine Liste von Interzeptor-Klassennamen für die Eigenschaften cxf.interceptors.in
und cxf.interceptors.out
angeben.
Nachfolgend sehen Sie ein Beispiel für eine jaxws-endpoint-config.xml
-Datei, die Interzeptoren mithilfe dieser Eigenschaften deklariert.
<?xml version="1.0" encoding="UTF-8"?> <jaxws-config xmlns="urn:jboss:jbossws-jaxws-config:4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:javaee="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="urn:jboss:jbossws-jaxws-config:4.0 schema/jbossws-jaxws-config_4_0.xsd"> <endpoint-config> <config-name>org.jboss.test.ws.jaxws.cxf.interceptors.EndpointImpl</config-name> <property> <property-name>cxf.interceptors.in</property-name> <property-value>org.jboss.test.ws.jaxws.cxf.interceptors.EndpointInterceptor,org.jboss.test.ws.jaxws.cxf.interceptors.FooInterceptor</property-value> </property> <property> <property-name>cxf.interceptors.out</property-name> <property-value>org.jboss.test.ws.jaxws.cxf.interceptors.EndpointCounterInterceptor</property-value> </property> </endpoint-config> </jaxws-config>
Apache CXF-Features
Der JBossWS-Deskriptor ermöglicht es Ihnen, Features innerhalb von vordefinierten Client- und Endpunktkonfigurationen zu deklarieren, indem Sie eine Liste von Feature-Klassennamen für die cxf.features
-Eigenschaft angeben.
Nachfolgend sehen Sie ein Beispiel für eine jaxws-endpoint-config.xml
-Datei, die ein Feature mithilfe dieser Eigenschaft deklariert.
<?xml version="1.0" encoding="UTF-8"?> <jaxws-config xmlns="urn:jboss:jbossws-jaxws-config:4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:javaee="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="urn:jboss:jbossws-jaxws-config:4.0 schema/jbossws-jaxws-config_4_0.xsd"> <endpoint-config> <config-name>Custom FI Config</config-name> <property> <property-name>cxf.features</property-name> <property-value>org.apache.cxf.feature.FastInfosetFeature</property-value> </property> </endpoint-config> </jaxws-config>
Apache CXF HTTP-Transport
In Apache CXF wird die HTTP-Transportkonfiguration erreicht, indem die org.apache.cxf.transport.http.HTTPConduit
-Optionen angegeben werden. Die JBossWS-Integration ermöglicht die befehlsgesteuerte Änderung von Conduits unter Verwendung der Apache CXF-API wie folgt.
import org.apache.cxf.frontend.ClientProxy; import org.apache.cxf.transport.http.HTTPConduit; import org.apache.cxf.transports.http.configuration.HTTPClientPolicy; // Set chunking threshold before using a JAX-WS port client ... HTTPConduit conduit = (HTTPConduit)ClientProxy.getClient(port).getConduit(); HTTPClientPolicy client = conduit.getClient(); client.setChunkingThreshold(8192); ...
Sie können die Apache CXF HTTPConduit
-Standardwerte auch steuern und außer Kraft setzen, indem Sie Systemeigenschaften einstellen.
Eigenschaft | Typ | Beschreibung |
---|---|---|
cxf.client.allowChunking |
Boolesche Variable |
Legt fest, ob die Anfragen unter Verwendung von Chunking gesendet werden sollen. |
cxf.client.chunkingThreshold |
Integer |
Legt den Grenzwert fest, an dem von Nicht-Chunking- auf Chunking-Modus gewechselt werden soll. |
cxf.client.connectionTimeout |
Long |
Legt die Anzahl der Millisekunden für die Zeitüberschreitung der Verbindung fest. |
cxf.client.receiveTimeout |
Long |
Legt die Anzahl der Millisekunden für die Zeitüberschreitung beim Empfang fest. |
cxf.client.connection |
Zeichenkette |
Legt fest, ob der Verbindungstyp |
cxf.tls-client.disableCNCheck |
Boolesche Variable |
Legt fest, ob die CN-Hostnamen-Prüfung deaktiviert werden soll. |
5.1.3. Änderungen der WS-Security
-
Falls Ihre Applikation einen angepassten Callback Handler enthält, der auf die Klasse
org.apache.ws.security.WSPasswordCallback
zugreift, dann beachten Sie, dass diese Klasse in das Paketorg.apache.wss4j.common.ext
verlegt wurde. -
Die meisten der SAML-Bean-Objekte vom Paket
org.apache.ws.security.saml.ext
wurden in das Paketorg.apache.wss4j.common.saml package
verlegt. - Verwenden Sie den RSA v1.5 Schlüsseltransport und alle zugehörigen Algorithmen sind standardmäßig untersagt.
-
Der Security Token Service (STS) validierte bisher lediglich
onBehalfOf
-Tokens. Er validiert nun auchActAs
-Tokens. Infolgedessen müssen gültige Werte für Benutzername und Passwort imUsernameToken
angegeben werden, das für dasActAs
-Token bereitgestellt wird. -
SAML Bearer Tokens müssen nun über eine interne Signatur verfügen. Die Klasse
org.apache.wss4j.dom.validate.SamlAssertionValidator
besitzt nun einesetRequireBearerSignature()
-Methode, um die Signaturprüfung zu aktivieren bzw. zu deaktivieren.
5.1.4. Änderungen der JBoss-Modulstruktur
Die JARs cxf-api
und cxf-rt-core
wurden in ein JAR namens cxf-core
zusammengelegt. Infolgedessen enthält das org.apache.cxf
-Modul in JBoss EAP nun das cxf-core
-JAR und bietet mehr Klassen als in der vorherigen Release.
5.1.5. Änderungen und Voraussetzungen von BouncyCastle
Falls Sie AES-Verschlüsselung mit Galois/Counter-Modus (GCM) für symmetrische Verschlüsselung in XML/WS-Security verwenden möchten, müssen Sie den BouncyCastle-Sicherheitsprovider nutzen.
JBoss EAP 7 enthält das org.bouncycastle
-Modul, und JBossWS ist nun dazu in der Lage, mithilfe seines Klassenladers den BouncyCastle-Sicherheitsprovider zu erhalten und zu verwenden. Es ist daher nicht mehr nötig, BouncyCastle statisch in der aktuellen JVM zu installieren. Für Applikationen, die außerhalb des Containers laufen, kann der Sicherheitsprovider für JBossWS verfügbar gemacht werden, indem eine BouncyCastle-Bibliothek zum Klassenpfad hinzugefügt wird.
Sie können dieses Verhalten deaktivieren, indem Sie den Eigenschaftswert org.jboss.ws.cxf.noLocalBC
auf true
setzen in der Deployment-Deskriptordatei jaxws-endpoint-config.xml
für den Server oder in der Deskriptordatei jaxws-client-config.xml
für Clients.
Falls Sie eine andere Version als die in JBoss EAP enthaltene Version verwenden möchten, können Sie nach wie vor BouncyCastle statisch in der JVM installieren. In diesem Fall wird der statisch installierte BouncyCastle-Sicherheitsprovider gewählt anstelle des Providers im Klassenpfad. Um Probleme zu vermeiden, müssen Sie BouncyCastle 1.49, 1.51 oder höher verwenden.
5.1.6. Apache CXF-Bus Auswahlstrategie
Die standardmäßige Strategie zur Bus-Auswahl für Clients, die im Container ausgeführt werden, hat sich geändert von THREAD_BUS
zu TCCL_BUS
. Für Clients, die außerhalb des Containers ausgeführt werden, ist die Standardstrategie noch immer THREAD_BUS
. Sie können zum Verhalten der vorherigen Release zurückkehren, indem Sie eine der beiden folgenden Maßnahmen durchführen.
-
Booten Sie den JBoss EAP Server mit dem Wert
THREAD_BUS
für die Systemeigenschaftorg.jboss.ws.cxf.jaxws-client.bus.strategy
. - Legen Sie die Auswahlstrategie ausdrücklich im Clientcode fest.
5.1.7. JAX-WS 2.2 Anforderungen für WebServiceRef
Container müssen Konstruktoren im JAX-WS 2.2 Stil nutzen, unter Verwendung der WebServiceFeature-Klasse, um Clients zu erstellen, die in Webservice-Referenzen injiziert werden. Das bedeutet, dass vom Benutzer angegebene Serviceklassen, die vom Container injiziert wurden, JAX-WS 2.2 oder höher implementieren müssen.
5.1.8. Änderungen der IgnoreHttpsHost CN-Überprüfung
In früheren Releases konnten Sie deaktivieren, dass der HTTPS URL-Hostname anhand des Common Name (CN) eines Services, der in dessen Zertifikat angegeben ist, überprüft wird. Sie erreichten dies durch Einstellen der Systemeigenschaft org.jboss.security.ignoreHttpsHost
auf true
. Diese Systemeigenschaft wurde ersetzt durch cxf.tls-client.disableCNCheck
.
5.1.9. Serverseitige Konfiguration und Klassenladen
As a consequence of enabling injections into service endpoint and service client handlers, it is no longer possible to automatically load handler classes from the org.jboss.as.webservices.server.integration
JBoss module. If your application depends on a given predefined configuration, you might need to explicitly define new module dependencies for your deployment. For more information, see Migrate Explicit Module Dependencies
5.1.10. Auslaufen des »Java Endorsed Standards Override Mechanism«
Der Java Endorsed Standards Override Mechanism gilt seit JDK 1.8_40 als veraltet und wird in JDK 9 planmäßig entfernt. Dieser Mechanismus erlaubte es Entwicklern, Bibliotheken für alle deployten Applikationen verfügbar zu machen, indem JARs in ein entsprechendes Verzeichnis innerhalb der JRE platziert wurden.
Falls Ihre Applikation die JBossWS-Implementierung von Apache CXF verwendet, gewährleistet JBoss EAP 7, dass die erforderlichen Abhängigkeiten in der richtigen Reihenfolge hinzugefügt werden, weshalb diese Änderung keine Auswirkungen auf Sie haben sollte. Falls Ihre Applikation direkt auf Apache CXF zugreift, müssen Sie nun die Apache CXF Abhängigkeiten nach den JBossWS-Abhängigkeiten hinzufügen im Rahmen Ihres Applikations-Deployments.
5.1.11. Spezifikation von Deskriptor in EAR-Archiv
In früheren Releases von JBoss EAP konnten Sie die Deployment-Deskriptordatei jboss-webservices.xml
für EJB-Webservice-Deployments im Verzeichnis META-INF/
von JAR-Archiven oder im Verzeichnis WEB-INF/
für POJO-Webservice-Deployments und EJB-Webservice-Endpunkte gebündelt in WAR-Archiven konfigurieren.
In JBoss EAP 7 können Sie nun die Deployment-Deskriptordatei jboss-webservices.xml
im Verzeichnis META-INF/
eines EAR-Archivs konfigurieren. Falls eine jboss-webservices.xml
-Datei sowohl im EAR-Archiv als auch im JAR- oder WAR-Archiv gefunden wird, dann setzen die Konfigurationsdaten in der jboss-webservices.xml
-Datei aus dem JAR oder WAR die entsprechenden Daten aus der EAR-Deskriptordatei außer Kraft.
5.2. Änderungen des Remote-URL-Connectors und -Ports
In JBoss EAP 7 wurde der Standard-Connector geändert von remote
auf http-remoting
und der standardmäßige Remote-Verbindungsport wurde geändert von 4447
auf 8080
. Die JNDI-Provider-URL für die Standardkonfiguration wurde geändert von remote://localhost:4447
auf http-remoting://localhost:8080
.
If you use the JBoss EAP 7 migrate
operation to update your configuration, you do not need to modify the remote connector, remote port, or JNDI provider URLs because the migration operation preserves the JBoss EAP 6 remoting connector and 4447
port configuration settings in the subsystem configuration. For more information about the migrate
operation, see Management CLI Migration Operation.
Falls Sie die migrate
-Operation nicht verwenden und stattdessen die neue JBoss EAP 7 Standardkonfiguration ausführen, müssen Sie den Remote-Connector, Remote-Port und die JNDI-Provider-URL auf die oben genannten neuen Einstellungen ändern.
5.3. Änderungen der Messaging-Applikation
5.3.1. Ersetzen oder Aktualisieren von JMS-Deployment-Deskriptoren
Die proprietären JMS-Ressourcen-Deployment-Deskriptordateien mit dem Namensformat -jms.xml
gelten in JBoss EAP 7 als veraltet. Nachfolgend sehen Sie ein Beispiel für eine JMS-Ressourcen-Deployment-Deskriptordatei in JBoss EAP 6.
<?xml version="1.0" encoding="UTF-8"?> <messaging-deployment xmlns="urn:jboss:messaging-deployment:1.0"> <hornetq-server> <jms-destinations> <jms-queue name="testQueue"> <entry name="queue/test"/> <entry name="java:jboss/exported/jms/queue/test"/> </jms-queue> <jms-topic name="testTopic"> <entry name="topic/test"/> <entry name="java:jboss/exported/jms/topic/test"/> </jms-topic> </jms-destinations> </hornetq-server> </messaging-deployment>
Falls Sie in der früheren Release -jms.xml
JMS-Deployment-Deskriptoren in Ihrer Applikation verwendet haben, können Sie Ihre Applikation entweder zur Verwendung des standardmäßigen Java EE 7 Deployment-Deskriptors konvertieren (siehe Abschnitt EE.5.18 der Java EE 7 specification) oder Sie können die Deployment-Deskriptoren auf das messaging-activemq
-Subsystem in JBoss EAP 7 aktualisieren.
Falls Sie sich dazu entscheiden, den Deskriptor zu aktualisieren, müssen Sie die folgenden Änderungen vornehmen.
- Ändern Sie den Namespace von »urn:jboss:messaging-deployment:1.0« auf »urn:jboss:messaging-activemq-deployment:1.0«.
-
Ändern Sie den Elementnamen
<hornetq-server>
auf<server>
.
Die aktualisierte Datei sollte etwa wie das folgende Beispiel aussehen.
<?xml version="1.0" encoding="UTF-8"?> <messaging-deployment xmlns="urn:jboss:messaging-activemq-deployment:1.0"> <server> <jms-destinations> <jms-queue name="testQueue"> <entry name="queue/test"/> <entry name="java:jboss/exported/jms/queue/test"/> </jms-queue> <jms-topic name="testTopic"> <entry name="topic/test"/> <entry name="java:jboss/exported/jms/topic/test"/> </jms-topic> </jms-destinations> </server> </messaging-deployment>
Weitere Informationen über Änderungen der Serverkonfiguration hinsichtlich Messaging finden Sie unter Änderungen der Messaging-Serverkonfiguration.
5.3.2. Aktualisieren der externen JMS-Clients
JBoss EAP 7 unterstützt weiterhin die JMS 1.1 API, Sie brauchen Ihren Code also nicht zu ändern.
Der standardmäßige Remote-Connector und Port wurde in JBoss EAP 7 geändert. Details über diese Änderung finden Sie unter Änderungen des Remote-URL-Connectors und -Ports.
Falls Sie Ihre Serverkonfiguration mithilfe der migrate
-Operation migrieren, werden die alten Einstellungen bewahrt und Sie müssen Ihre PROVIDER_URL
nicht aktualisieren. Wenn Sie dagegen die neue JBoss EAP 7 Standardkonfiguration verwenden, müssen Sie die PROVIDER_URL
im Client-Code ändern, um die neue Einstellung http-remoting://localhost:8080
zu verwenden. Weitere Informationen finden Sie unter Migrieren von Remote-Naming-Client-Code.
Falls Sie planen, Ihren Code zur JMS 2.0 API zu migrieren, werfen Sie einen Blick auf den helloworld-jms
-Quickstart für ein Arbeitsbeispiel.
5.3.3. Ersetzen der HornetQ-API
JBoss EAP 6 enthielt das org.hornetq
-Modul, das Ihnen die Verwendung der HornetQ-API in Ihrem Applikationsquellcode ermöglichte.
Apache ActiveMQ Artemis ersetzt HornetQ in JBoss EAP 7, weshalb Sie jeglichen Code, der die HornetQ-API verwendete, zur Apache ActiveMQ Artemis API migrieren müssen. Die Bibliotheken für diese API sind im Modul org.apache.activemq.artemis
enthalten.
ActiveMQ Artemis ist eine Weiterentwicklung von HornetQ; viele der Grundlagen gelten weiterhin.
5.4. Änderungen der JAX-RS und RESTEasy-Applikation
Die vorherige Release von JBoss EAP umfasste RESTEasy 2, was eine Implementierung von JAX-RS 1.x war. JBoss EAP 7 enthält RESTEasy 3, was eine Implementierung von JAX-RS 2.0 ist, wie von der Spezifikation JSR 339: JAX-RS 2.0: The Java API for RESTful Web Services definiert. Weitere Informationen über die Java API für RESTful Webservices finden Sie unter JAX-RS 2.0 API Specification.
Die in JBoss EAP enthaltene Version von Jackson hat sich geändert. Die vorherige Version von JBoss EAP enthielt Jackson 1.9.9, JBoss EAP 7 enthält jetzt Jackson 2.6.3 oder höher.
This section describes how these changes might impact applications that use RESTEasy or JAX-RS.
5.4.1. Veraltete Klassen in RESTEasy
Interzeptor- und MessageBody-Klassen
JSR 311: JAX-RS: The Java™ API für RESTful-Webservices enthielt kein Interzeptor-Framework, weshalb RESTEasy 2 eines bereitstellte. JSR 339: JAX-RS 2.0: Die Java-API für RESTful-Webservices führte ein offizielles Interzeptor- und Filter-Framework ein, weshalb das in RESTEasy 2 enthaltene Interzeptor-Framework nun als veraltet gilt und durch die JAX-RS 2.0 konforme Interzeptor-Facility in RESTEasy 3.x. ersetzt wurde. Die relevanten Schnittstellen werden im Paket javax.ws.rs.ext
des Moduls jaxrs-api
definiert.
Die folgenden Interzeptor-Schnittstellen gelten in RESTEasy 3.x als veraltet.
-
Die Schnittstelle
org.jboss.resteasy.spi.interception.PreProcessInterceptor
wurde in RESTEasy 3.x ersetzt durch die Schnittstellejavax.ws.rs.container.ContainerRequestFilter
. Die folgenden Schnittstellen und Klassen gelten ebenfalls als veraltet in RESTEasy 3.x.
-
org.jboss.resteasy.spi.interception.MessageBodyReaderInterceptor
-
org.jboss.resteasy.spi.interception.MessageBodyWriterInterceptor
-
org.jboss.resteasy.spi.interception.MessageBodyWriterContext
-
org.jboss.resteasy.spi.interception.MessageBodyReaderContext
-
org.jboss.resteasy.core.interception.InterceptorRegistry
-
org.jboss.resteasy.core.interception.InterceptorRegistryListener
-
org.jboss.resteasy.core.interception.ClientExecutionContextImpl
-
-
Die Schnittstelle
org.jboss.resteasy.spi.interception.MessageBodyWriterInterceptor
wurde ersetzt durch die Schnittstellejavax.ws.rs.ext.WriterInterceptor
. In addition, some changes to the
javax.ws.rs.ext.MessageBodyWriter
interface might not be backward compatible with respect to JAX-RS 1.x. If your application used JAX-RS 1.x, review your application code to make sure you define@Produces
or@Consumes
for your endpoints. Failure to do so might result in an error similar to the following.org.jboss.resteasy.core.NoMessageBodyWriterFoundFailure: Could not find MessageBodyWriter for response object of type: <OBJECT> of media type:
Nachfolgend sehen Sie ein Beispiel für einen REST-Endpunkt, der diesen Fehler verursacht.
@Path("dates") public class DateService { @GET @Path("daysuntil/{targetdate}") public long showDaysUntil(@PathParam("targetdate") String targetDate) { DateLogger.LOGGER.logDaysUntilRequest(targetDate); final long days; try { final LocalDate date = LocalDate.parse(targetDate, DateTimeFormatter.ISO_DATE); days = ChronoUnit.DAYS.between(LocalDate.now(), date); } catch (DateTimeParseException ex) { // ** DISCLAIMER **. This example is contrived. throw new WebApplicationException(Response.status(400).entity(ex.getLocalizedMessage()).type(MediaType.TEXT_PLAIN) .build()); } return days; } }
Um diesen Fehler zu beheben, fügen Sie den Import für
javax.ws.rs.Produces
und die Annotation@Produces
wie folgt hinzu.... import javax.ws.rs.Produces; ... @Path("dates") public class DateService { @GET @Path("daysuntil/{targetdate}") @Produces(MediaType.TEXT_PLAIN) public long showDaysUntil(@PathParam("targetdate") String targetDate) { DateLogger.LOGGER.logDaysUntilRequest(targetDate); final long days; try { final LocalDate date = LocalDate.parse(targetDate, DateTimeFormatter.ISO_DATE); days = ChronoUnit.DAYS.between(LocalDate.now(), date); } catch (DateTimeParseException ex) { // ** DISCLAIMER **. This example is contrived. throw new WebApplicationException(Response.status(400).entity(ex.getLocalizedMessage()).type(MediaType.TEXT_PLAIN) .build()); } return days; } }
Alle Interzeptoren aus der vorherigen Release von RESTEasy können parallel zum neuen JAX-RS 2.0 Filter und den Interzeptor-Schnittstellen laufen.
For more information about interceptors, see RESTEasy Interceptors in Developing Web Services Applications for JBoss EAP.
Weitere Informationen über die neue Ersatz-API finden Sie unter RESTEasy JAX-RS 3.0.13.Final API oder höher.
Client-API
Das RESTEasy-Client-Framework in resteasy-jaxrs
wurde ersetzt durch das JAX-RS 2.0 konforme resteasy-client
-Modul. Infolgedessen sind einige RESTEasy-Client-API-Klassen und -Methoden nun veraltet.
Die folgenden Klassen sind veraltet.
-
Die Ausnahme
org.jboss.resteasy.client.ClientResponseFailure
und die Schnittstellenorg.jboss.resteasy.client.ClientExecutor
undorg.jboss.resteasy.client.EntityTypeFactory
sind ebenfalls veraltet. Sie müssen die Klassen
org.jboss.resteasy.client.ClientRequest
undorg.jboss.resteasy.client.ClientResponse
ersetzen durchorg.jboss.resteasy.client.jaxrs.ResteasyClient
bzw.javax.ws.rs.core.Response
.Nachfolgend sehen Sie ein Beispiel für das Senden eines Link-Headers mit dem RESTEasy-Client in RESTEasy 2.3.x.
ClientRequest request = new ClientRequest(generateURL("/linkheader/str")); request.addLink("previous chapter", "previous", "http://example.com/TheBook/chapter2", null); ClientResponse response = request.post(); LinkHeader header = response.getLinkHeader();
Nachfolgend sehen Sie ein Beispiel für das Durchführen derselben Aufgabe mit dem RESTEasy-Client in RESTEasy 3.
ResteasyClient client = new ResteasyClientBuilder().build(); Response response = client.target(generateURL("/linkheader/str")).request() .header("Link", "<http://example.com/TheBook/chapter2>; rel=\"previous\"; title=\"previous chapter\"").post(Entity.text(new String())); javax.ws.rs.core.Link link = response.getLink("previous");
Siehe
resteasy-jaxrs-client
-Quickstart für ein Beispiel für einen externen JAX-RS RESTEasy-Client, der mit einem JAX-RS Webservice interagiert.-
Die Klassen und Schnittstellen im Paket
org.jboss.resteasy.client.cache
sind ebenfalls veraltet. Sie wurden ersetzt durch entsprechende Klassen und Schnittstellen im Paketorg.jboss.resteasy.client.jaxrs.cache
.
Weitere Informationen über die API-Klassen org.jboss.resteasy.client.jaxrs
finden Sie unter RESTEasy JAX-RS JavaDoc.
StringConverter
Die Klasse org.jboss.resteasy.spi.StringConverter
gilt in RESTEasy 3.x als veraltet. Diese Funktionalität kann ersetzt werden durch Verwendung der JAX-RS 2.0 Klasse jax.ws.rs.ext.ParamConverterProvider.
5.4.2. Entfernte oder geschützte RESTEasy-Klassen
ResteasyProviderFactory Add-Methoden
Die meisten der add()
-Methoden von org.jboss.resteasy.spi.ResteasyProviderFactory
wurden in RESTEasy 3.0 entfernt oder geschützt. Beispielsweise wurden die Methoden addBuiltInMessageBodyReader()
und addBuiltInMessageBodyWriter()
entfernt und die Methoden addMessageBodyReader()
und addMessageBodyWriter()
geschützt.
Sie sollten nun die Methoden registerProvider()
und registerProviderInstance()
verwenden.
Weitere von RESTEasy 3 entfernte Klassen
Die Annotation @org.jboss.resteasy.annotations.cache.ServerCached
, die angibt, dass die Antwort auf die JAX-RS-Methode auf dem Server gecacht werden soll, wurde aus RESTEasy 3 entfernt und muss aus dem Applikationscode entfernt werden.
5.4.3. Weitere RESTEasy-Änderungen
SignedInput und SignedOuput
-
SignedInput
undSignedOutput
fürresteasy-crypto
müssen denContent-Type
aufmultipart/signed
gesetzt haben, entweder imRequest
- oder imResponse
-Objekt oder durch Verwendung der Annotation@Consumes
oder@Produces
. -
SignedOutput
undSignedInput
können dazu verwendet werden, um dasapplication/pkcs7-signature
MIME-Type-Format in Binärformat zurückzugeben, indem dieser Typ in der Annotation@Produces
oder@Consumes
festgelegt wird. -
Falls
@Produces
oder@Consumes
vom MIME-Typtext/plain
ist, wirdSignedOutput
base64-kodiert und als Zeichenkette gesendet.
Sicherheitsfilter
Die Sicherheitsfilter für @RolesAllowed
, @PermitAll
und @DenyAll
geben nun »403 Forbidden« statt »401 Unauthorized« zurück.
Clientseitige Filter
Die neuen JAX-RS 2.0 clientseitigen Filter werden nicht gebunden und ausgeführt, wenn Sie die RESTEasy-Client-API aus der vorherigen Release verwenden.
Asynchrone HTTP-Unterstützung
Because the JAX-RS 2.0 specification adds asynchronous HTTP support using the @Suspended
annotation and the AsynResponse
interface, the RESTEasy proprietary API for asynchronous HTTP has been deprecated and might be removed as soon as RESTEasy 3.1. The asynchronous Tomcat and asynchronous JBoss Web modules have also been removed from the server installation. If you are not using the Servlet 3.0 container or higher, asynchronous HTTP server-side processing will be simulated and run synchronously in same request thread.
Serverseitiger Cache
Die Einrichtung des serverseitigen Caches hat sich verändert. Siehe RESTEasy-Dokumentation für weitere Informationen.
5.4.4. Änderungen der RESTEasy SPI
SPI-Ausnahmen
Alle SPI-Fehlerausnahmen gelten nun als veraltet und werden intern nicht mehr verwendet. Sie wurden durch entsprechende JAX-RS 2.0 Ausnahmen ersetzt.
Veraltete Ausnahme | Ersatz-Ausnahme im jaxrs-api-Modul |
---|---|
org.jboss.resteasy.spi.ForbiddenException |
javax.ws.rs.ForbiddenException |
org.jboss.resteasy.spi.MethodNotAllowedException |
javax.ws.rs.NotAllowedException |
org.jboss.resteasy.spi.NotAcceptableException |
javax.ws.rs.NotAcceptableException |
org.jboss.resteasy.spi.NotFoundException |
javax.ws.rs.NotFoundException |
org.jboss.resteasy.spi.UnauthorizedException |
javax.ws.rs.NotAuthorizedException |
org.jboss.resteasy.spi.UnsupportedMediaTypeException |
javax.ws.rs.NotSupportedException |
InjectorFactory und Registry
Die InjectorFactory
- und Registry
-SPIs haben sich verändert. Dies sollte keinerlei Probleme verursachen, sofern Sie RESTEasy wie dokumentiert und unterstützt einsetzen.
5.4.5. Änderungen des Jackson-Providers
Die in JBoss EAP enthaltene Version von Jackson hat sich geändert. Die vorherige Version von JBoss EAP umfasste Jackson 1.9.9. JBoss EAP 7 enthält nun Jackson 2.6.3 oder höher. Infolgedessen hat sich der Jackson-Provider geändert von resteasy-jackson-provider
auf resteasy-jackson2-provider
.
Das Upgrade auf resteasy-jackson2-provider
erfordert einige Paketänderungen. Beispielsweise hat sich das Jackson-Annotationspaket geändert von org.codehaus.jackson.annotate
auf com.fasterxml.jackson.annotation
.
To switch your application to use the default provider that was included in the previous release of JBoss EAP, see Switching the Default Jackson Provider in Developing Web Services Applications for JBoss EAP.
5.4.6. Änderungen der Spring RESTEasy-Integration
Das Spring 4.0 Framework führte Unterstützung für Java 8 ein. Falls Sie planen, die RESTEasy 3.x Integration mit Spring zu verwenden, stellen Sie sicher, dass Sie 4.2.x als Mindestversion für Spring in Ihrem Deployment spezifizieren, da dies die früheste stabile Version ist, die von JBoss EAP 7 unterstützt wird.
5.4.7. Änderungen des RESTEasy Jettison JSON-Providers
Der RESTEasy Jettison JSON-Provider gilt in JBoss EAP 7 als veraltet und wird standardmäßig nicht mehr zu Deployments hinzugefügt. Wir raten Ihnen, auf den empfohlenen RESTEasy Jackson-Provider zu wechseln. Falls Sie es vorziehen, weiterhin den Jettison-Provider zu verwenden, müssen Sie eine explizite Abhängigkeit dafür in der Datei jboss-deployment-descriptor.xml
definieren, wie im folgenden Beispiel veranschaulicht.
<?xml version="1.0" encoding="UTF-8"?> <jboss-deployment-structure> <deployment> <exclusions> <module name="org.jboss.resteasy.resteasy-jackson2-provider"/> <module name="org.jboss.resteasy.resteasy-jackson-provider"/> </exclusions> <dependencies> <module name="org.jboss.resteasy.resteasy-jettison-provider" services="import"/> </dependencies> </deployment> </jboss-deployment-structure>
For more information about how to define explicit dependencies, see Add an Explicit Module Dependency to a Deployment in the JBoss EAP Development Guide.
5.5. Änderungen der CDI 1.2 Applikation
JBoss EAP 7 includes support for CDI 1.2. As a result, applications written using CDI 1.0 might see some changes in behavior when migrated to JBoss EAP 7. This section summarizes only a few of those changes.
Weitere Informationen über Weld und CDI 1.2 finden Sie in den folgenden Quellen:
Bean-Archive
Bean-Klassen mit aktivierten Beans müssen in Bean-Archiven deployt sein, um zu gewährleisten, dass sie vom CDI überprüft werden und die Bean-Klassen somit gefunden und verarbeitet werden.
In CDI 1.0 war ein Archiv definiert als ein explizites Bean-Archiv, wenn es eine beans.xml
-Datei im Verzeichnis META-INF/
eines Applikations-Clients, EJB oder Bibliothek-JAR enthielt, oder wenn es eine beans.xml
-Datei im Verzeichnis WEB-INF/
für ein WAR enthielt.
CDI 1.1 führte implizite Bean-Archive ein, bei denen es sich um Archive handelt, die eine oder mehrere Bean-Klassen mit einer Annotation zur Bean-Definition haben, oder eine oder mehrere Session-Beans. Implizite Bean-Archive werden von CDI geprüft, und während der Typerkennung werden nur Klassen mit Annotationen zur Bean-Definition gefunden. Weitere Informationen finden Sie unter Type and Bean Discovery in Contexts and Dependency Injection for the Java EE platform.
Ein Bean-Archiv hat den Bean-Discovery-Modus all
, annotated
oder none
. Ein Bean-Archiv, das eine beans.xml
-Datei ohne Version enthält, hat standardmäßig den Bean-Discovery-Modus all
. Ein Bean-Archiv, das eine beans.xml
-Datei der Version 1.1
oder höher enthält, muss den Parameter bean-discovery-mode
angeben. Der Standardwert für diesen Parameter lautet annotated
.
In den folgenden Fällen ist ein Archiv ist kein Bean-Archiv:
-
Es enthält eine
beans.xml
-Datei mit dembean-discovery-mode
none
. -
Es enthält eine CDI-Erweiterung ohne
beans.xml
-Datei.
In den folgenden Fällen ist ein Archiv ein explizites Bean-Archiv:
-
Das Archiv enthält eine
beans.xml
-Datei mit der Versionsnummer 1.1 oder höher und denbean-discovery-mode
all
. -
Das Archiv enthält eine
beans.xml
-Datei ohne Versionsnummer. -
Das Archiv enthält eine leere
beans.xml
-Datei.
In den folgenden Fällen ist ein Archiv ein implizites Bean-Archiv:
-
Das Archiv enthält eine oder mehrere Bean-Klassen mit einer Annotation zur Bean-Definition, oder eine oder mehrere Session-Beans, selbst wenn es keine
beans.xml
-Datei enthält. -
Das Archiv enthält eine
beans.xml
-Datei mit dembean-discovery-mode
annotated
.
CDI 1.2 beschränkt Annotationen zur Bean-Definition auf die folgenden:
-
@ApplicationScoped
,@SessionScoped
,@ConversationScoped
und@RequestScoped
- Alle anderen normalen Scope-Typen
-
@Interceptor
und@Decorator
-
Alle Stereotyp-Annotationen, also Annotationen mit
@Stereotype
annotiert -
@Dependent
Scope-Annotation
Weitere Informationen über Bean-Archive finden Sie unter Bean Archives in Contexts and Dependency Injection for the Java EE platform.
Klärung der Konversationsauflösung
Der Lebenszyklus des Konversationskontexts wurde geändert, um Konflikte mit der Servlet-Spezifikation (wie in CDI Specification Issue CDI-411 beschrieben) zu vermeiden. Der Konversations-Scope ist während jeglicher Servlet-Anfragen aktiv und sollte andere Servlets oder Servlet-Filter nicht daran hindern, den Anfrage-Body oder die Zeichenkodierung einzustellen.
Observer-Auflösung
Die Ereignisauflösung wurde in CDI 1.2 teilweise umgeschrieben. In CDI 1.0 wurde ein Ereignis an eine Observer-Methode übergeben, wenn die Observer-Methode alle Ereignis-Qualifier besitzt. In CDI 1.2 wird ein Ereignis an eine Observer-Methode übergeben, wenn die Observer-Methode keine Ereignis-Qualifier oder nur eine Untermenge der Ereignis-Qualifier besitzt.
5.6. Migrieren expliziter Modulabhängigkeiten
Die Einführung des modularen Klassenladesystems und JBoss Modules in der vorherigen Release von JBoss EAP ermöglichte eine genaue Steuerung der Klassen, die Applikationen zur Verfügung stehen. Dieses Feature ermöglichte Ihnen die Konfiguration expliziter Modulabhängigkeiten mithilfe der MANIFEST.MF
-Datei oder der jboss-deployment-structure.xml
Deployment-Deskriptordatei der Applikation.
Falls Sie explizite Modulabhängigkeiten in Ihrer Applikation definiert haben, sollten Sie sich der folgenden Änderungen in JBoss EAP 7 bewusst sein.
Überprüfen der Abhängigkeiten auf Verfügbarkeit
Die Module, die in JBoss EAP enthalten sind, haben sich geändert. Wenn Sie Ihre Applikation zu JBoss EAP 7 migrieren, prüfen Sie Ihre MANIFEST.MF
- und jboss-deployment-structure.xml
-Dateieinträge, um sicherzustellen, dass diese keine Module referenzieren, die aus dieser Produktrelease entfernt wurden.
Abhängigkeiten, die Annotations-Prüfung erfordern
Falls Ihre Abhängigkeiten Annotationen enthielten, die während der Annotationsprüfung verarbeitet werden mussten (z.B. beim Deklarieren von EJB-Interzeptoren), dann mussten Sie in der vorherigen Version von JBoss EAP einen Jandex-Index in einer neuen JAR-Datei generieren und einbeziehen und anschließend ein Flag in der MANIFEST.MF
oder jboss-deployment-structure.xml
Deployment-Deskriptordatei setzen.
JBoss EAP 7 generiert nun automatisch zur Laufzeit Annotationsindizes für statische Module, sodass Sie diese nicht mehr manuell erstellen müssen. Allerdings müssen Sie noch das annotations
-Flag zur MANIFEST.MF
-Datei oder zur jboss-deployment-structure.xml
-Deployment-Deskriptordatei der Applikation hinzufügen, wie unten veranschaulicht.
Beispiel für Annotations-Flag in der MANIFEST.MF-Datei
Dependencies: com.company.my-ejb annotations, com.company.other
Beispiel für Annotations-Flag in der jboss-deployment-structure.xml-Datei
<jboss-deployment-structure> <deployment> <dependencies> <module name="com.company.my-ejb" annotations="true"/> <module name="com.company.other"/> </dependencies> </deployment> </jboss-deployment-structure>
5.7. Änderungen hinsichtlich Hibernate und JPA
5.7.1. Hibernate ORM 3.0
Die Integrationsklassen, die eine Verwendung von Hibernate ORM 3 in der vorherigen Release erleichtert haben, wurden aus JBoss EAP 7 entfernt. Falls Ihre Applikation noch Hibernate ORM 3 Bibliotheken verwendet, empfehlen wir Ihnen dringend, Ihre Applikation auf Hibernate ORM 5 zu migrieren, da Hibernate ORM 3 nicht mehr ohne Weiteres in JBoss EAP funktionieren wird. Falls Sie nicht zu Hibernate ORM 5 migrieren können, müssen Sie ein angepasstes JBoss-Modul für die Hibernate ORM 3 JARs definieren und die Hibernate ORM 5 Klassen aus Ihrer Applikation ausschließen.
5.7.2. Hibernate ORM 4.0 – 4.3
Falls Ihre Applikation einen aktiven Second-Level-Cache benötigt, sollten Sie zu Hibernate ORM 5 migrieren, was in Infinispan 8.x integriert ist.
Applikationen, die mit Hibernate ORM 4.x geschrieben wurden, können weiterhin Hibernate ORM 4.x verwenden. Sie müssen ein angepasstes JBoss-Modul für die Hibernate ORM 4.x JARs definieren und die Hibernate ORM 5 Klassen aus Ihrer Applikation ausschließen. Allerdings empfehlen wir Ihnen dringend, Ihren Applikationscode zur Verwendung von Hibernate ORM 5 umzuschreiben. Informationen über die Migration zu Hibernate ORM 5 finden Sie unter Migrieren zu Hibernate ORM 5.
5.7.3. Hibernate ORM 5
Falls Ihre Applikation eine persistence.xml
-Datei enthält oder der Code die Annotationen @PersistenceContext
oder @PersistenceUnit
verwendet, so spürt JBoss EAP 7 dies während des Deployments auf und geht davon aus, dass die Applikation JPA verwendet. es fügt dem Klassenpfad Ihrer Applikation implizit die Hibernate ORM 5 Bibliotheken sowie ein paar andere Abhängigkeiten hinzu und verwendet standardmäßig diese Bibliotheken.
5.7.4. Migrieren zu Hibernate ORM 5
Dieser Abschnitt behandelt die erforderlichen Änderungen für die Migration von Hibernate ORM Version 4.3 zu Version 5. Weitere Informationen über die Veränderungen von Hibernate ORM 5 im Vergleich zu Hibernate ORM 4 finden Sie im Hibernate ORM 5.0 Migration Guide.
Entfernte und veraltete Klassen
Die folgenden veralteten Klassen wurden aus Hibernate ORM 5 entfernt.
Sonstige Änderungen an Klassen und Paketen
-
Die Schnittstelle
org.hibernate.integrator.spi.Integrator
hat sich entsprechend der Bootstrap-Überarbeitung verändert. -
Ein neues Paket
org.hibernate.engine.jdbc.env
wurde erstellt. Es enthält die Schnittstelleorg.hibernate.engine.jdbc.env.spi.JdbcEnvironment
, die aus der Schnittstelleorg.hibernate.engine.jdbc.spi.JdbcServices
extrahiert wurde. -
Eine neue Schnittstelle
org.hibernate.boot.model.relational.ExportableProducer
wurde eingeführt, was Auswirkungen auforg.hibernate.id.PersistentIdentifierGenerator
-Implementierungen hat. -
Die Signatur von
org.hibernate.id.Configurable
wurde geändert, umorg.hibernate.service.ServiceRegistry
zu akzeptieren, statt nurorg.hibernate.dialect.Dialect
. -
Die Schnittstelle
org.hibernate.metamodel.spi.TypeContributor
wurde migriert zuorg.hibernate.boot.model.TypeContributor
. -
Die Schnittstelle
org.hibernate.metamodel.spi.TypeContributions
wurde migriert zuorg.hibernate.boot.model.TypeContributions
.
Typenhandhabung
-
Integrierte
org.hibernate.type.descriptor.sql.SqlTypeDescriptor
-Implementierungen registrieren sich nicht mehr automatisch bei derorg.hibernate.type.descriptor.sql.SqlTypeDescriptorRegistry
. Applikationen, die angepassteSqlTypeDescriptor
-Implementierungen verwenden, welche die integrierten Implementierungen erweitern und auf dieses Verhalten angewiesen sind, müssen aktualisiert werden, um selbstSqlTypeDescriptorRegistry.addDescriptor()
aufzurufen. -
Für IDs, die als generierte UUIDs definiert sind, setzen einige Datenbanken voraus, dass Sie für die Generierung von
BINARY(16)
die@Column(length=16)
ausdrücklich festlegen, damit der Abgleich einwandfrei funktioniert. -
Für
EnumType
-Mappings, die in der Dateihbm.xml
definiert sind und Siejavax.persistence.EnumType.STRING
name-mapping
möchten, muss diese Konfiguration ausdrücklich angegeben werden. Nutzen Sie dazu entweder die EinstellunguseNamed(true)
oder geben Sie einen VARCHAR-Wert von12
an.
Transaktionsverwaltung
-
Die Transaktions-SPI wurde in Hibernate ORM 5 umfassend überarbeitet. In Hibernate ORM 4.3 verwendeten Sie die
org.hibernate.Transaction
-API, um direkt auf verschiedene Back-end-Transaktionsstrategien zuzugreifen. Hibernate ORM 5 führte eine Ebene der Indirektion ein. Im Back-end kommuniziert dieorg.hibernate.Transaction
Implementierung nun mit einemorg.hibernate.resource.transaction.TransactionCoordinator
, der den transaktionalen Kontext für eine angegebene Sitzung repräsentiert gemäß Back-end-Strategie. Dies hat zwar keine direkten Auswirkungen auf Entwickler, könnte aber die Bootstrap-Konfiguration beeinflussen. Bislang spezifizierten Applikationen die Eigenschafthibernate.transaction.factory_class
(die jetzt veraltet ist) und verwiesen auf einenorg.hibernate.engine.transaction.spi.TransactionFactory
-FQN (vollständigen Namen). Mit Hibernate ORM 5 spezifizieren Sie die Einstellunghibernate.transaction.coordinator_class
und verweisen auf einenorg.hibernate.resource.transaction.TransactionCoordinatorBuilder
. Sieheorg.hibernate.cfg.AvailableSettings.TRANSACTION_COORDINATOR_STRATEGY
für weitere Einzelheiten. Die folgenden Kurznamen werden jetzt erkannt.
-
jdbc: Manage transactions using the JDBC
java.sql.Connection
. This is the default for non-JPA transactions. jta: Manage transactions using JTA.
WichtigIf a JPA application does not provide a setting for the
hibernate.transaction.coordinator_class
property, Hibernate will automatically build the proper transaction coordinator based on the transaction type for the persistence unit.If a non-JPA application does not provide a setting for the
hibernate.transaction.coordinator_class
property, Hibernate will default tojdbc
to manage the transactions. This default will cause problems if the application actually uses JTA-based transactions. A non-JPA application that uses JTA-based transactions should explicitly set thehibernate.transaction.coordinator_class
property value tojta
or provide a customorg.hibernate.resource.transaction.TransactionCoordinatorBuilder
that builds aorg.hibernate.resource.transaction.TransactionCoordinator
that properly coordinates with JTA-based transactions.
-
jdbc: Manage transactions using the JDBC
Sonstige Hibernate ORM 5 Änderungen
-
Die
cfg.xml
-Dateien werden wieder vollständig analysiert und integriert in Ereignissen, in der Sicherheit und in anderen Funktionen. -
Die mittels
EntityManagerFactory
voncfg.xml
geladenen Eigenschaften haben die Namen bislang nicht mit dem Präfixhibernate
versehen. Dies wurde jetzt vereinheitlicht. - Die Konfiguration ist nicht mehr serialisierbar.
-
Die Methode
org.hibernate.dialect.Dialect.getQuerySequencesString()
ruft nun Werte für Katalog, Schema und Inkrement ab. -
Der Modifier
AuditConfiguration
wurde ausorg.hibernate.envers.boot.internal.EnversService
entfernt. -
Die Methodenparameter
AuditStrategy
wurden geändert, um die hinfälligeAuditConfiguration
zu entfernen und den neuenEnversService
zu verwenden. -
Verschiedene Klassen und Schnittstellen im
org.hibernate.hql.spi
-Paket und Unterpaketen wurden verlegt in das neue Paketorg.hibernate.hql.spi.id
. Dazu gehört die KlasseMultiTableBulkIdStrategy
sowie die SchnittstellenAbstractTableBasedBulkIdHandler
,TableBasedDeleteHandlerImpl
undTableBasedUpdateHandlerImpl
samt deren Unterklassen. - Die Verträge für Eigenschaftszugriff wurden vollständig überarbeitet.
-
Gültige Werte für die Einstellung
hibernate.cache.default_cache_concurrency_strategy
sind nun definiert anhand der Methodeorg.hibernate.cache.spi.access.AccessType.getExternalName()
anstelle der Aufzählungskonstantenorg.hibernate.cache.spi.access.AccessType
. Dies steht im Einklang mit anderen Hibernate-Einstellungen.
5.8. Änderungen hinsichtlich Hibernate Search
Die in JBoss EAP 7 integrierte Version von Hibernate Search hat sich geändert. Die vorherige Release von JBoss EAP enthielt Hibernate Search 4.6.x. JBoss EAP 7 enthält nun Hibernate Search 5.5.x.
Hibernate Search 5.5 is built upon Apache Lucene 5.3.1. If you use any native Lucene APIs, be sure to align with this version. The Hibernate Search 5.5 API wraps and hides the complexity of many of the Lucene API changes made between version 3 and version 5, however, some classes are now deprecated, renamed, or repackaged. This section describes how these changes might impact your application code.
Änderungen des Hibernate Search Mappings
Indexierung von ID-Feldern in eingebetteten Objekten
Wenn eine @IndexedEmbedded
-Annotation verwendet wird, um Felder von einem zugehörigen Objekt einzubinden, dann ist die id
des zugehörigen Objekts nicht mehr enthalten. Sie können die Einbeziehung der id
aktivieren, indem Sie den Parameter includeEmbeddedObjectId
der Annotation @IndexedEmbedded
verwenden.
@IndexedEmbedded(includeEmbeddedObjectId=true)
Änderungen der Formatierung von Zahlen- und Datumsindexierung
Zahlen und Daten werden nun standardmäßig als numerische Felder indiziert. Eigenschaften des Typs int
, long
, float
, double
und deren jeweiligen Wrapper-Klassen werden nicht mehr als Zeichenketten (Strings) indiziert. Stattdessen werden sie nun unter Verwendung von Lucenes numerischer Kodierung indiziert. Die id
-Felder stellen eine Ausnahme von dieser Regel dar. Selbst wenn es sich bei ihnen um einen numerischen Typ handelt, werden sie standardmäßig dennoch als Zeichenketten indiziert. Die Verwendung von @NumericField
ist nun obsolet, es sei denn, Sie möchten eine angepasste Länge für die numerische Kodierung festlegen. Sie können das alte stringbasierte Indexformat behalten, indem Sie explizit eine Feld-Bridge zur String-Kodierung angeben. Für Integer ist dies die org.hibernate.search.bridge.builtin.IntegerBridge. Im Paket org.hibernate.search.bridge.builtin finden Sie andere öffentlich verfügbare Bridges.
Date
und Calendar
werden nicht mehr als Zeichenketten indiziert. Stattdessen werden sie nun als Long-Werte kodiert, die für die Anzahl der Millisekunden seit dem 1. Januar 1970, 00:00:00 GMT stehen. Sie können das Indexierungsformat ändern, indem Sie die neue EncodingType-Aufzählung verwenden. Zum Beispiel:
@DateBridge(encoding=EncodingType.STRING) @CalendarBridge(encoding=EncodingType.STRING)
Die geänderte Kodierung für Zahlen und Daten ist wichtig und kann weitreichende Auswirkungen auf das Applikationsverhalten haben. Falls Sie eine Anfrage haben, die auf ein Feld abzielt, das bislang stringkodiert war, jetzt jedoch numerisch kodiert wird, müssen Sie die Anfrage entsprechend umschreiben. Numerische Felder müssen mit einer NumericRangeQuery
durchsucht werden. Sie müssen auch sicherstellen, dass alle Felder, auf die die Facettierung abzielt, nun stringkodiert sind. Falls Sie die Search Query DSL verwenden, sollte die korrekte Anfrage automatisch für Sie erstellt werden.
Sonstige Änderungen hinsichtlich Hibernate Search
-
Die Sortierungsoptionen wurden verbessert; die inkorrekte Angabe der Feldkodierung für Sortierungsoptionen führt nun zu einem Laufzeitfehler. Lucene bietet zudem eine leistungsstärkere Sortierung, wenn die in der Sortierung verwendeten Felder bereits bekannt sind. Hibernate Search 5.5 bietet die neuen Annotationen
@SortableField
bzw.@SortableFields
. Unter Migration Guide from Hibernate Search 5.4 to 5.5 finden Sie weitere Informationen. Die Lucene
SortField
-API erfordert die folgenden Änderungen am Applikationscode.In der vorherigen Release von JBoss EAP legten Sie den Typ des Sortierungsfeldes wie folgt in der Anfrage fest.
fulltextQuery.setSort(new Sort(new SortField("title", SortField.STRING)));
Nachfolgend sehen Sie ein Beispiel dafür, wie dies in JBoss EAP 7 angegeben wird.
fulltextQuery.setSort(new Sort(new SortField("title", SortField.Type.STRING)));
-
Da
SearchFactory
nur von ORM-Integrationen verwendet werden sollte, wurde sie vom Modulhibernate-search-engine
in das Modulhibernate-search-orm
verlegt. Andere Integratoren sollten ausschließlichSearchIntegrator
verwenden, was das veralteteSearchFactoryIntegrator
ersetzt. -
Der Aufzählungswert
SpatialMode.GRID
wurde umgenannt zuSpatialMode.HASH
. -
FullTextIndexEventListener
ist nun eine finale Klasse. Falls Sie derzeit diese Klasse erweitern, müssen Sie eine alternative Lösung finden, um dieselbe Funktionalität zu erreichen. -
Das Modul
hibernate-search-analyzers
wurde entfernt. Die empfohlene Herangehensweise ist nun die direkte Verwendung des jeweiligen Lucene-Artefakts, zum Beispielorg.apache.lucene:lucene-analyzers-common
. -
The JMS controller API has changed. The JMS back-end dependency on Hibernate ORM was removed so that it could be used in other non-ORM environments. A consequence is that implementors of
org.hibernate.search.backend.impl.jms.AbstractJMSHibernateSearchController
must adjust to the new signature. This class is an internal class and it is recommended to use it as an example instead of extending it. -
Die
org.hibernate.search.spi.ServiceProvider
-SPI wurde refaktoriert. Falls Sie den alten Dienstvertrag integriert haben, werfen Sie einen Blick auf das Hibernate Search 5.5 Javadoc vonServiceManager
,Service
,Startable
undStoppable
für Einzelheiten zum neuen Vertrag. -
Falls Sie die von Lucene 3.x generierten Indexe behalten haben und diese nicht mit Hibernate Search 5.0 oder höher neu erstellt haben, erhalten Sie den Fehler
IndexFormatTooOldException
. Es wird empfohlen, die Indexe mit dem Massenindexer neu zu erstellen. Falls Ihnen das nicht möglich ist, sollten Sie LucenesIndexUpgrader
probieren. Sie müssen die Hibernate Search Mappings sorgfältig aktualisieren für den Fall, dass sich das Standardverhalten geändert hat. Weitere Informationen siehe Apache Lucene Migration Guide. - Apache Lucene wurde in JBoss EAP 7 aktualisiert von 3.6 auf 5.3. Falls Ihr Code Lucene-Code direkt importiert, finden Sie unter Apache Lucene Migration Guide die Einzelheiten dieser Änderungen. Weitere Informationen finden Sie auch im Lucene Change Log.
-
Wenn Sie
@Field(indexNullAs=)
zum Kodieren eines Nullmarker-Werts im Index verwenden, muss der Typ des Markers kompatibel mit allen anderen Werten sein, die in demselben Feld indexiert werden. Beispielsweise war es bislang möglich, einen Nullwert für numerische Felder mittels der Zeichenkette »null« zu kodieren. Dies ist nicht mehr zulässig. Stattdessen müssen Sie eine Zahl wählen, die für dennull
-Wert steht, wie z.B.-1
. -
An der Facettierungs-Engine wurden deutliche Verbesserungen vorgenommen. Die meisten Änderungen haben keine Auswirkungen auf die API. Die einzige nennenswerte Ausnahme ist, dass Sie nun alle Felder, die Sie bei der Facettierung verwenden möchten, mit den Annotationen
@Facet
oder@Facets
annotieren müssen.
Unbenannte und neu paketierte Klassen in Hibernate Search
Nachfolgend sehen Sie eine Liste mit Hibernate Search Klassen, die neu paketiert oder umbenannt wurden.
Bisherige Pakete und Klassen | Neue Pakete und Klassen |
---|---|
org.hibernate.search.Environment |
org.hibernate.search.cfg.Environment |
org.hibernate.search.FullTextFilter |
org.hibernate.search.filter.FullTextFilter |
org.hibernate.search.ProjectionConstants |
org.hibernate.search.engine.ProjectionConstants |
org.hibernate.search.SearchException |
org.hibernate.search.exception.SearchException |
org.hibernate.search.Version |
org.hibernate.search.engine.Version |
Unbenannte und neu paketierte Klassen in Lucene
Anfragen-Parser wurden in ein neues Modul verlegt, weshalb sich das Paket geändert hat von org.apache.lucene.queryParser.QueryParser
auf org.apache.lucene.queryparser.classic.QueryParser
.
Viele der Lucene-Analyzers wurden refaktoriert, weshalb sich deren Pakete geändert haben. Siehe Apache Lucene Documentation für Einzelheiten zu den neuen Paketen.
Einige Apache Solr-Dienstklassen wie beispielsweise TokenizerFactory
oder TokenFilterFactory
wurden in Apache Lucene verlegt. Falls Ihre Applikation diese Dienste oder angepasste Analyzer verwendet, müssen Sie die neuen Paketnamen in Apache Lucene suchen.
Siehe Apache Lucene Migration Guide für weitere Informationen.
Veraltete APIs in Hibernate Search
Eine vollständige Liste der veralteten Schnittstellen, Klassen, Aufzählungstypen, Methoden, Konstruktoren und Aufzählungskonstanten finden Sie unter Hibernate Search Deprecated API.
Veraltete Schnittstellen in Hibernate Search
Schnittstelle | Beschreibung |
---|---|
org.hibernate.search.store.IndexShardingStrategy |
Veraltet ab Hibernate Search 4.4. Wird möglicherweise ab Search 5 entfernt. Verwenden Sie stattdessen ShardIdentifierProvider. |
org.hibernate.search.store.Workspace |
Diese Schnittstelle wird verlegt und sollte als nicht öffentliche API betrachtet werden. Weitere Informationen siehe HSEARCH-1915. |
Veraltete Klassen in Hibernate Search
Klasse | Beschreibung |
---|---|
org.hibernate.search.filter.FilterKey |
Angepasste Filter-Keys gelten als veraltet und werden planmäßig aus Hibernate Search 6 entfernt. Ab Hibernate Search 5.1 werden Keys zum Cachen von Lucene-Filtern automatisch basierend auf angegebenen Filterparametern berechnet. |
org.hibernate.search.filter.StandardFilterKey |
Angepasste Filter-Keys gelten als veraltet und werden planmäßig aus Hibernate Search 6 entfernt. Ab Hibernate Search 5.1 werden Keys zum Cachen von Lucene-Filtern automatisch basierend auf angegebenen Filterparametern berechnet. |
Veraltete Aufzählungen in Hibernate Search
Aufzählung | Beschreibung |
---|---|
org.hibernate.search.annotations.FieldCacheType |
Entfernen Sie die veraltete Annotation |
Veraltete Annotationen in Hibernate Search
Annotation | Beschreibung |
---|---|
org.hibernate.search.annotations.CacheFromIndex |
Entfernen Sie die Annotation. Ein Ersatz ist nicht nötig. |
org.hibernate.search.annotations.Key |
Angepasste Filter-Cache-Keys sind eine veraltete Funktion und werden planmäßig aus Hibernate Search 6 entfernt. Ab Hibernate Search 5.1 werden Filter-Cache-Keys automatisch basierend auf den Filterparametern berechnet, sodass es nicht mehr nötig ist, ein Key-Objekt anzugeben. |
Veraltete Methoden in Hibernate Search
Methode | Beschreibung |
---|---|
org.hibernate.search.FullTextSharedSessionBuilder.autoClose() |
Kein Ersatz |
org.hibernate.search.FullTextSharedSessionBuilder.autoClose(boolean) |
Kein Ersatz |
org.hibernate.search.cfg.IndexedMapping.cacheFromIndex(FieldCacheType…) |
Dies wird ersatzlos entfernt. |
org.hibernate.search.cfg.EntityDescriptor.getCacheInMemory() |
Dies wird ersatzlos entfernt. |
org.hibernate.search.cfg.ContainedInMapping.numericField() |
Rufen Sie stattdessen |
org.hibernate.search.cfg.EntityDescriptor.setCacheInMemory(Map<String, Object>) |
Dies wird ersatzlos entfernt. |
org.hibernate.search.MassIndexer.threadsForSubsequentFetching(int) |
Diese Methode wird entfernt. |
org.hibernate.search.query.dsl.FuzzyContext.withThreshold(float) |
Verwenden Sie |
Veraltete Konstruktoren in Hibernate Search
Konstruktor | Beschreibung |
---|---|
org.hibernate.search.cfg.NumericFieldMapping(PropertyDescriptor, EntityDescriptor, SearchMapping) |
Verwenden Sie stattdessen |
Änderungen mit Auswirkungen auf erweiterte Integratoren
Dieser Abschnitt beschreibt Änderungen, die nicht Teil der öffentlichen API sind. Sie sollten keinerlei Auswirkungen auf normale Entwickler haben, da auf diese Artefakte nur von Integratoren zugegriffen wird, die das Hibernate Search Framework erweitern.
-
Die Aufzählungskonstanten
IndexWriterSetting.MAX_THREAD_STATES
undIndexWriterSetting.TERM_INDEX_INTERVAL
sind veraltet. Sie beeinflussen, welche Eigenschaften aus der Konfiguration gelesen werden; dass diese nun fehlen, bedeutet, dass Konfigurationseigenschaften wiehibernate.search.Animals.2.indexwriter.term_index_interval = default
nun ignoriert werden. Die einzige Nebenwirkung ist die, dass die Eigenschaft nicht angewendet wird. -
Die Schnittstelle
SearchFactoryIntegrator
ist nun veraltet. Sie sollten unverzüglich sämtlichen Code zuSearchIntegrator
migrieren. -
Die Klasse
SearchFactoryBuilder
ist nun veraltet. Verwenden Sie stattdessenSearchIntegrationBuilder
. -
The
HSQuery.getExtendedSearchIntegrator()
method has been deprecated. It might be possible to useSearchIntegrator
, but it is preferable to remove it altogether. -
Die Methode
DocumentBuilderIndexedEntity.getFieldCacheOption()
ist nun veraltet. Es gibt keinen Ersatz. -
Die Methode
BuildContext.getIndexingStrategy()
ist nun veraltet. Verwenden Sie stattdessenBuildContext.getIndexingMode()
. -
Die Methode
DirectoryHelper.getVerifiedIndexDir(String, Properties, boolean)
ist veraltet. Verwenden Sie stattdessenDirectoryHelper.getVerifiedIndexPath(java.lang.String, java.util.Properties, boolean)
. Nachfolgend sehen Sie eine Liste mit Hibernate Search Klassen, die neu paketiert oder umbenannt wurden.
Bisherige Pakete und Klassen Neue Pakete und Klassen org.hibernate.search.engine.impl.SearchMappingBuilder
org.hibernate.search.engine.spi.SearchMappingHelper
org.hibernate.search.indexes.impl.DirectoryBasedIndexManager
org.hibernate.search.indexes.spi.DirectoryBasedIndexManager
org.hibernate.search.spi.MassIndexerFactory
org.hibernate.search.batchindexing.spi.MassIndexerFactory
org.hibernate.search.spi.SearchFactoryBuilder
org.hibernate.search.spi.SearchIntegratorBuilder
org.hibernate.search.spi.SearchFactoryIntegrator
org.hibernate.search.spi.SearchIntegrator
5.9. Migrieren von Entity-Beans zu JPA
Unterstützung für EJB-Entity-Beans ist optional in Java EE 7, und sie werden in JBoss EAP 7 nicht unterstützt. Das bedeutet, dass Container-Managed Persistence (CMP) und Bean-Managed Persistence (BMP) Entity-Beans für die Migration zu JBoss EAP 7 umgeschrieben werden müssen, um Java-Persistence-API (JPA) Entitys zu verwenden.
In früheren Releases von JBoss EAP wurden Entity-Beans im Applikations-Quellcode erstellt, indem die Klasse javax.ejb.EntityBean
erweitert und die erforderlichen Methoden implementiert wurden. Anschließend wurden Sie in der Datei ejb-jar.xml
konfiguriert. Eine CMP-Entity-Bean wurde spezifiziert mithilfe eines <entity>
-Elements, das ein <persistence-type>
-Unterelement mit dem Wert Container enthielt. Eine BMP-Entity-Bean wurde spezifiziert mithilfe eines <entity>
-Elements, das ein <persistence-type>
-Unterelement mit dem Wert Bean enthielt.
In JBoss EAP 7 müssen Sie jegliche CMP- und BMP-Entity-Beans in Ihrem Code durch Java Persistence API (JPA) Entitys ersetzen. JPA-Entitys werden erstellt mithilfe von javax.persistence.*-Klassen und werden in der Datei persistence.xml
definiert.
Nachfolgend sehen Sie ein Beispiel für eine JPA-Entity-Klasse
import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; @Entity // User is a keyword in some SQL dialects! @Table(name = "MyUsers") public class MyUser { @Id @GeneratedValue private Long id; @Column(unique = true) private String username; private String firstName; private String lastName; public Long getId() { return id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; }
Nachfolgend sehen Sie ein Beispiel für eine persistence.xml
-Datei.
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> <persistence-unit name="my-unique-persistence-unit-name"> <properties> // properties... </properties> </persistence-unit> </persistence>
Beispiele für JPA-Entitys finden Sie in den Quickstarts bmt
, cmt
und hibernate5
, die in JBoss EAP 7 enthalten sind.
5.10. Änderungen der JPA-Persistenzeigenschaft
Eine neue Persistenzeigenschaft namens jboss.as.jpa.deferdetach
wurde hinzugefügt, um Kompatibilität mit dem Persistenzverhalten früherer Releases von JBoss EAP zu bieten.
Die Eigenschaft jboss.as.jpa.deferdetach
steuert, ob der transaktionsweite Persistenzkontext, der in einem nicht-JTA-Transaktions-Thread verwendet wird, geladene Entitys nach jedem EntityManager
-Aufruf löst, oder ob er wartet, bis der Persistenzkontext geschlossen wird, beispielsweise wenn der Session-Bean-Aufruf beendet ist. Der Standardwert der Eigenschaft ist false
, was bedeutet, dass Entitys nach jedem EntityManager
-Aufruf gelöst oder gelöscht werden. Dies ist das korrekte Standardverhalten gemäß JPA-Spezifikation. Ist der Eigenschaftswert auf true
gesetzt, dann werden die Entitys nicht gelöst, ehe der Persistenzkontext geschlossen wurde.
In JBoss EAP 5 verhielt sich die Persistenz, als sei die Eigenschaft jboss.as.jpa.deferdetach
auf true
eingestellt. Um dasselbe Verhalten zu erreichen, wenn Sie Ihre Applikation von JBoss EAP 5 zu JBoss EAP 7 migrieren, müssen Sie den Eigenschaftswert jboss.as.jpa.deferdetach
auf true
einstellen in Ihrer persistence.xml
, wie im folgenden Beispiel veranschaulicht.
<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0"> <persistence-unit name="EAP5_COMPAT_PU"> <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source> <properties> <property name="jboss.as.jpa.deferdetach" value="true" /> </properties> </persistence-unit> </persistence>
In JBoss EAP 6 verhielt sich die Persistenz, als sei die Eigenschaft jboss.as.jpa.deferdetach
auf false
eingestellt. Dies ist dasselbe Verhalten wie in JBoss EAP 7, also sind keinerlei Änderungen nötig, wenn Sie Ihre Applikation migrieren.
5.11. Migrieren von EJB-Client-Code
Der standardmäßige Remote-Connector und Port wurde in JBoss EAP 7 geändert. Details über diese Änderung finden Sie unter Änderungen des Remote-URL-Connectors und -Ports.
Falls Sie die migrate
-Operation zur Migration der Serverkonfiguration verwenden, werden die alten Einstellungen bewahrt, sodass die unten beschriebenen Änderungen nicht notwendig sind. Wenn Sie allerdings die neue JBoss EAP 7 Standardkonfiguration ausführen, müssen Sie die folgenden Änderungen vornehmen.
5.11.1. Aktualisieren des standardmäßigen Remote-Verbindungsports
Ändern Sie den Wert für den Remote-Verbindungsport von 4447
auf 8080
in der Datei jboss-ejb-client.properties
.
Nachfolgend sehen Sie Beispiele für eine jboss-ejb-client.properties
-Datei in der vorherigen und in der aktuellen Release.
Beispiel: JBoss EAP 6 jboss-ejb-client.properties Datei
remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false remote.connections=default remote.connection.default.host=localhost remote.connection.default.port=4447 remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
Beispiel: JBoss EAP 7 jboss-ejb-client.properties Datei
remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false remote.connections=default remote.connection.default.host=localhost remote.connection.default.port=8080 remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
5.11.2. Aktualisieren des Standard-Connectors
Falls Sie die neue JBoss EAP 7 Konfiguration ausführen, hat sich der Standard-Connector von remote
auf http-remoting
geändert. Diese Änderung betrifft Clients, die Bibliotheken aus einer Release von JBoss EAP nutzen und mit einem Server in einer anderen Release verbinden.
-
Falls eine Client-Applikation die EJB-Client-Bibliothek von JBoss EAP 6 verwendet und mit einem JBoss EAP 7 Server verbinden will, dann muss der Server dazu konfiguriert sein, einen
remote
-Connector auf einem anderen Port als8080
verfügbar zu machen. Der Client muss dann mit dem neu konfigurierten Connector verbinden. Eine Client-Applikation, die die EJB-Client-Bibliothek von JBoss EAP 7 verwendet und mit einem JBoss EAP 6 Server verbinden will, muss darüber informiert sein, dass die Server-Instanz nicht den
http-remoting
-Connector verwendet, sondern einenremote
-Connector. Dies erreichen Sie, indem Sie eine neue clientseitige Verbindungseigenschaft definieren.remote.connection.default.protocol=remote
5.11.3. Migrieren von Remote-Naming-Client-Code
Falls Sie die neue standardmäßige JBoss EAP 7 Konfiguration ausführen, müssen Sie Ihren Client-Code zur Verwendung des neuen standardmäßigen Remote-Ports und -Connectors konfigurieren.
Nachfolgend sehen Sie ein Beispiel dafür, wie Remote-Naming-Eigenschaften im Client-Code in JBoss EAP 6 spezifiziert wurden.
java.naming.factory.initial=org.jboss.naming.remote.client.InitialContextFactory java.naming.provider.url=remote://localhost:4447
Nachfolgend sehen Sie ein Beispiel dafür, wie Remote-Naming-Eigenschaften im Client-Code in JBoss EAP 7 spezifiziert werden.
java.naming.factory.initial=org.jboss.naming.remote.client.InitialContextFactory java.naming.provider.url=http-remoting://localhost:8080
5.12. Migrieren von Deployment-Plan-Konfigurationen
Die Java EE Spezifikation für Applikations-Deployment (JSR-88) wurde dazu entworfen, um einen Vertrag zu definieren, der es Tools verschiedener Anbieter ermöglichen sollte, Applikationen auf jeder beliebigen Java EE Plattform zu konfigurieren und bereitzustellen. Der Vertrag erforderte von den Anbietern der Java EE Produkte, DeploymentManager
und andere javax.enterprise.deploy.spi
-Schnittstellen bereitzustellen für den Zugriff durch die Tool-Anbieter. Im Falle von JBoss EAP 6 besteht ein Deployment-Plan aus einem XML-Deskriptor namens deployment-plan.xml
, der in einem ZIP- oder JAR-Archiv gebündelt ist.
Diese Spezifikation fand nur wenig Anwendung, da die meisten Applikationsserver-Produkte ihre eigenen, funktionsreicheren Deployment-Lösungen bereitstellten. Aus diesem Grund wurde die Unterstützung für JSR-88 in Java EE 7 aufgegeben und infolgedessen auch in JBoss EAP 7.
If you used JSR-88 to deploy your application, you must now use another method to deploy the application. The JBoss EAP management CLI deploy
command provides a standard way to deploy archives to standalone servers or to server groups in a managed domain. For more information about the management CLI, see the Management CLI Guide.
5.13. Migrieren von angepassten Applikations-Valves
Sie müssen angepasste Valves und jegliche Valves, die in der XML-Datei jboss-web.xml
definiert sind, manuell migrieren. Dazu gehören Valves, die erstellt wurden durch Erweitern der org.apache.catalina.valves.ValveBase
-Klasse und Konfigurieren des <valve>
-Elements in der jboss-web.xml
-Deskriptordatei.
Angepasste Valves und solche Valves, die in der jboss-web.xml
-Datei definiert sind, müssen neu geschrieben oder ersetzt werden durch den jeweiligen integrierten Undertow-Handler. Informationen über die Zuordnung von Valves zu Undertow-Handlern finden Sie unter Migrieren von JBoss Web Valves.
Authentifikations-Valves müssen manuell ersetzt werden durch die integrierten Undertow-Authentifizierungsmechanismen.
Migrieren der in Deployments konfigurierten Valves
In JBoss EAP 6 konnten Sie auf Applikationsebene angepasste Valves definieren, indem Sie die diese in der jboss-web.xml
-Webapplikations-Deskriptordatei konfigurierten. In JBoss EAP 7 ist dies ebenfalls möglich mithilfe von Undertow-Handlern.
Nachfolgend sehen Sie ein Beispiel für eine Valve, die in der jboss-web.xml
-Datei in JBoss EAP 6 konfiguriert ist.
<jboss-web> <valve> <class-name>org.jboss.examples.MyValve</class-name> <param> <param-name>myParam</param-name> <param-value>foobar</param-value> </param> </valve> </jboss-web>
For more information about how to create and configure custom handlers in JBoss EAP, see Creating Custom Handlers in the JBoss EAP Development Guide.
Migrieren von angepassten Authentifikations-Valves
Weitere Informationen über die Migration von Authentifikations-Valves finden Sie unter Sicherheitsrelevante Applikationsänderungen
5.14. Sicherheitsrelevante Applikationsänderungen
Aufgrund des Wechsels von JBoss Web nach Undertow sind Änderungen an der Sicherheitskonfiguration in JBoss EAP 7 erforderlich.
5.14.1. Migrieren von Authentifikations-Valves
Authentifikations-Valves müssen manuell ersetzt werden durch die integrierten Undertow-Authentifizierungsmechanismen. In den folgenden Abschnitten finden Sie weitere Informationen über das Migrieren von Authentifikations-Valves.
5.14.2. Änderungen an PicketLink
For information about the changes required for SSO with SAML v2 configuration, see Changes from Previous Versions of JBoss EAP in How to Set Up SSO with SAML v2 for JBoss EAP.
5.14.3. Sonstige sicherheitsrelevante Applikationsänderungen
For information about the differences in SSO configuration with Kerberos, see Differences from Configuring Previous Versions JBoss EAP in How to Set Up SSO with Kerberos for JBoss EAP.
5.15. Änderungen an der JBoss-Protokollierung
Falls Ihre Applikation JBoss-Protokollierung verwendet, beachten Sie, dass die Annotationen im org.jboss.logging
-Paket in JBoss EAP 7 nunmehr als veraltet gelten. Sie wurden in das org.jboss.logging.annotations
-Paket verlegt, weshalb Sie Ihren Quellcode zum Import des neuen Pakets ändern müssen.
Die Annotationen wurden zudem in eine separate Maven groupId:artifactId:version
(GAV) ID verlegt, sodass Sie eine neue Projektabhängigkeit für org.jboss.logging:jboss-logging-annotations
in der pom.xml
-Datei Ihres Projekts hinzufügen müssen.
Nur die Logging-Annotationen wurden verlegt. Die org.jboss.logging.BasicLogger
und org.jboss.logging.Logger
befinden sich weiterhin im org.jboss.logging
-Paket.
Die folgende Tabelle führt die veralteten Annotationsklassen und entsprechenden Ersatz auf.
Veraltete Klasse | Ersatzklasse |
---|---|
org.jboss.logging.Cause |
org.jboss.logging.annotations.Cause |
org.jboss.logging.Field |
org.jboss.logging.annotations.Field |
org.jboss.logging.FormatWith |
org.jboss.logging.annotations.FormatWith |
org.jboss.logging.LoggingClass |
org.jboss.logging.annotations.LoggingClass |
org.jboss.logging.LogMessage |
org.jboss.logging.annotations.LogMessage |
org.jboss.logging.Message |
org.jboss.logging.annotations.Message |
org.jboss.logging.MessageBundle |
org.jboss.logging.annotations.MessageBundle |
org.jboss.logging.MessageLogger |
org.jboss.logging.annotations.MessageLogger |
org.jboss.logging.Param |
org.jboss.logging.annotations.Param |
org.jboss.logging.Property |
org.jboss.logging.annotations.Property |
5.16. JavaServer Faces (JSF) Code-Änderungen
Beendete Unterstützung für JSF 1.2
JBoss EAP 6 ermöglichte es Ihnen, weiterhin JSF 1.2 in Ihrem Applikations-Deployment zu verwenden, indem Sie eine jboss-deployment-structure.xml
-Datei erstellten.
JBoss EAP 7 enthält JSF 2.2 und unterstützt die JSF 1.2 API nicht mehr. Falls Ihre Applikation JSF 1.2 verwendet, müssen Sie diese auf JSF 2.2 umschreiben.
Kompatibilitätsprobleme zwischen JSF 2.1 und JSF 2.2
Die JSF 2.1 und JSF 2.2 APIs sind nicht vollständig kompatibel. Der Wert der Konstante FACELET_CONTEXT_KEY
hat sich geändert von com.sun.faces.facelets.FACELET_CONTEXT
auf javax.faces.FACELET_CONTEXT
in der neuen Releases. Der Compiler führt für diesen Wert eine Inline-Ersetzung durch – Code, der für eine Release kompiliert wurde, kann nicht für eine anderen Release funktionieren.
Applikationen, die ähnlichen Code wie im folgenden Beispiel enthalten und mit der JSF 2.1 API kompiliert wurden, jedoch in JBoss EAP 7 (was die JSF 2.2 API verwendet) ausgeführt werden, verursachen eine NullPointerException
. Um dieses Problem zu beheben, müssen Sie die Applikation mit der JSF 2.2 API neu kompilieren.
Object obj = FacesContext.getCurrentInstance().getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY);
Siehe JAVASERVERFACES_SPEC_PUBLIC-1257 für weitere Informationen.
5.17. Änderungen am Modul-Klassenladen
In JBoss EAP 7 hat sich das Verhalten des Klassenladens geändert in Fällen, in denen mehrere Module dieselben Klassen oder Pakete enthalten.
Angenommen es gibt zwei Module, MODULE_A
und MODULE_B
, die voneinander abhängen und zum Teil die gleichen Pakete enthalten. In JBoss EAP 6 hatten die Klassen oder Pakete, die von den Abhängigkeiten geladen wurden, Vorrang vor jenen, die im resource-root
der module.xml
-Datei angegeben wurden. Das bedeutet, dass MODULE_A
die Pakete für MODULE_B
sah und MODULE_B
die Pakete für MODULE_A
sah. Dieses Verhalten war verwirrend und ein Grund für mögliche Konflikte, weshalb es in JBoss EAP 7 geändert wurde. Jetzt haben die Klassen oder Pakete, die im resource-root
in der module.xml
-Datei angegeben werden, Vorrang vor jenen, die von der Abhängigkeit spezifiziert werden. Das bedeutet, dass MODULE_A
die Pakete für MODULE_A
sieht und MODULE_B
die Pakete für MODULE_B
sieht. Dies vermeidet Konflikte und sorgt für ein angemesseneres Verhalten.
If you have defined custom modules that include resource-root
libraries or packages that contain classes that are duplicated in their module dependencies, you might see ClassCastException
, LinkageError
, class loading errors, or other changes in behavior when you migrate to JBoss EAP 7. To resolve these issues, you must configure your module.xml
file to ensure only one version of a class is used. This can be accomplished by using either of the following approaches.
-
Sie können vermeiden, ein
resource-root
anzugeben, das doppelte Klassen in der Modulabhängigkeit definiert. Sie können die Subelemente
include
undexclude
der Elementeimports
undexports
verwenden, um das Klassenladen in dermodule.xml
-Datei zu steuern. Nachfolgend sehen Sie ein Export-Element, das Klassen in dem angegebenen Paket ausschließt.<exports> <exclude path="com/mycompany/duplicateclassespath/"/> </exports>
Falls Sie es vorziehen, Ihr derzeitiges Verhalten beizubehalten, müssen Sie die Pakete der Abhängigkeiten von der abhängigen resource-root
in der module.xml
-Datei mithilfe des filter
-Elements filtern. Dies ermöglicht es Ihnen, das derzeitige Verhalten beizubehalten, ohne manche Schleifen, die unter JBoss EAP 6 auftreten würden. Nachfolgend sehen Sie ein Beispiel für ein root-resource
, das Klassen in einem angegebenen Paket filtert.
<resource-root path="mycompany.jar"> <filter> <exclude path="com/mycompany/duplicateclassespath"/> </filter> </resource-root>
For more information about modules and class loading, see Class Loading and Modules in the JBoss EAP Development Guide.
5.18. Änderungen des Applikations-Clusterings
5.18.1. Überblick über neue Clustering-Features
Die folgende Liste beschreibt einige der neuen Clustering-Features, die Sie kennen sollten, wenn Sie Ihre Applikation von JBoss EAP 6 zu JBoss EAP 7 migrieren.
- JBoss EAP 7 introduces a new public API for building singleton services that significantly simplifies the process. For more information, see Implement an HA Singleton in Developing EJB Applications for JBoss EAP.
- A singleton deployment can be configured to deploy and start on only a single node in the cluster at a time. For more information, see HA Singleton Deployments in the JBoss EAP Development Guide.
- You can now define clustered singleton MDBs. For more information, see Clustered Singleton MDBs in Developing EJB Applications for JBoss EAP.
- JBoss EAP 7 includes the Undertow mod_cluster implementation. This offers a pure Java load balancing solution that does not require an httpd web server. For more information, see Configuring JBoss EAP as a Front-end Load Balancer in the JBoss EAP Configuration Guide.
The remainder of this section describes how clustering changes might impact the migration of your applications to JBoss EAP 7.
5.18.2. Änderungen des Web-Session-Clusterings
JBoss EAP 7 führt eine neue Implementierung für Web-Session-Clustering ein. Diese ersetzt die vorherige Implementierung, die eng mit dem veralteten JBoss Web Subsystem-Quellcode verknüpft war.
Infolge der neuen Implementierung für Web-Session-Clustering verändert sich auch die Konfiguration der Applikation in der jboss-web.xml
JBoss proprietären Webapplikation-XML-Deskriptordatei. Die nachfolgend aufgeführten sind die einzigen, in der Datei noch verbliebenen Clustering-Konfigurationselemente.
<jboss-web> ... <max-active-sessions>...</max-active-sessions> ... <replication-config> <replication-granularity>...</replication-granularity> <cache-name>...</cache-name> </replication-config> ... </jboss-web>
Die folgende Tabelle beschreibt, wie für Elemente in der jboss-web.xml
-Datei, die nun veraltet sind, ein ähnliches Verhalten erreicht werden kann.
Konfigurationselement | Beschreibung der Änderung |
---|---|
<max-active-sessions/> |
Bislang schlug die Session-Erstellung fehl, falls dadurch die Anzahl der aktiven Sessions den in
In der neuen Implementierung wird |
<passivation-config/> |
Dieses Konfigurationselement und dessen Unterelemente werden in JBoss EAP 7 nicht mehr verwendet. |
<use-session-passivation/> |
Bislang wurde die Passivierung mithilfe dieses Attributs ermöglicht.
In der neuen Implementierung wird die Passivierung aktiviert, indem ein nicht negativer Wert für |
<passivation-min-idle-time/> |
Bislang mussten Sessions mindestens für eine bestimmte Zeitspanne aktiv sein, bevor sie für eine Passivierung in Frage kamen. Dadurch war es möglich, dass die Session-Erstellung fehlschlug, selbst wenn die Passivierung aktiviert war. Die neue Implementierung unterstützt diese Logik nicht und vermeidet dadurch diese Denial of Service (DoS) Schwachstelle. |
<passivation-max-idle-time/> |
Bislang wurde eine Session passiviert, sobald Sie für eine bestimmte Zeitspanne inaktiv war.
Die neue Implementierung unterstützt nur eine reaktive Passivierung, keine aktive Passivierung. Sessions werden nur passiviert, wenn dies erforderlich ist, um |
<replication-config/> |
In der neuen Implementierung gelten eine Reihe von Unterelementen nun als veraltet. |
<replication-trigger/> |
Previously, this element was used to determine when session replication was triggered. The new implementation replaces this configuration option with a single, robust strategy. For more information, see Immutable Session Attributes in the JBoss EAP Development Guide. |
<use-jk/> |
Bislang wurde die
In der neuen Implementierung wird die |
<max-unreplicated-interval/> |
Bislang diente diese Konfigurationsoption der Optimierung, um die Replikation eines Session-Timestamps zu verhindern, wenn kein Session-Attribut verändert wurde. Theoretisch war dies sinnvoll, praktisch verhinderte es jedoch keine RPCs, da der Session-Zugriff nach wie vor RPCs für die Cache-Transaktion erforderte, unabhängig davon, ob Session-Attribute verändert wurden oder nicht. In der neuen Implementierung wird der Timestamp einer Session bei jeder Anfrage repliziert. Dies verhindert veraltete Session-Metadaten nach einem Failover. |
<snapshot-mode/> |
Bislang konnte man |
<snapshot-interval/> |
Dies war nur relevant für |
<session-notification-policy/> |
Bislang definierte der Wert dieses Attributs eine Richtlinie zum Auslösen von Session-Ereignissen. In der neuen Implementierung ist dieses Verhalten spezifikationsabhängig und nicht konfigurierbar. |
Diese neue Implementierung unterstützt zudem Write-Through Cache-Speicher sowie Cache-Speicher nur mit Passivierung. Üblicherweise wird ein Write-Through Cache-Speicher zusammen mit einem Invalidierungs-Cache eingesetzt. Die Web-Session-Clustering-Implementierung in JBoss EAP 6 funktionierte nicht einwandfrei zusammen mit einem Invalidierungs-Cache.
5.18.3. Änderungen am Stateful Session EJB Clustering
In JBoss EAP 6 war es erforderlich, das Clustering-Verhalten für Stateful Session Beans (SFSBs) auf einer der folgenden Arten zu aktivieren.
Sie konnten die
org.jboss.ejb3.annotation.Clustered
-Annotation in der Session-Bean hinzufügen.@Stateful @Clustered public class MyBean implements MySessionInt { public void myMethod() { // } }
Sie konnten das
<clustered>
-Element zurjboss-ejb3.xml
-Datei hinzufügen.<c:clustering> <ejb-name>DDBasedClusteredSFSB</ejb-name> <c:clustered>true</c:clustered> </c:clustering>
In JBoss EAP 7 ist es nicht mehr erforderlich, das Clustering-Verhalten zu aktivieren. Wenn der Server unter Verwendung eines HA-Profils startet, wird der Zustand von SFSBs standardmäßig automatisch repliziert.
Sie können dieses Standardverhalten auf eine der folgenden Weisen deaktiveren.
-
Sie können das standardmäßige Verhalten für eine einzelne Stateful Session Bean mithilfe von
@Stateful(passivationCapable=false)
deaktivieren; dies ist neu in der EJB 3.2 Spezifikation. -
Sie können dieses Verhalten global deaktivieren in der Konfiguration des
ejb3
-Subsystems in der Serverkonfiguration.
Falls die @Clustered
-Annotation nicht von der Applikation entfernt wird, so wird sie einfach ignoriert und hat keine Auswirkungen auf die Applikation.
5.18.4. Änderungen des Clustering-Services
In JBoss EAP 6 befanden sich die APIs für Clustering-Services in privaten Modulen und wurden nicht unterstützt.
JBoss EAP 7 führte eine öffentliche Clustering-Service-API für die Applikationen ein. Die neuen Services wurden konzipiert mit einem schlanken Design, sind einfach einzuspeisen, und erfordern keine externe Abhängigkeiten.
-
Die neue
org.wildfly.clustering.group.Group
-Schnittstelle bietet Zugang zum aktuellen Cluster-Status und ermöglicht das Lauschen auf Änderungen der Cluster-Mitgliedschaft. -
Die neue
org.wildfly.clustering.dispatcher.CommandDispatcher
-Schnittstelle ermöglicht das Ausführen von Code im Cluster, entweder auf allen Knoten oder auf einer Untergruppe ausgewählter Knoten.
Diese Services ersetzen ähnliche APIs, die in vorherigen Releases verfügbar waren, nämlich HAPartition
aus JBoss EAP 5 und GroupCommunicationService
, GroupMembershipNotifier
und GroupRpcDispatcher
in JBoss EAP 6.
For more information, see Public API for Clustering Services in the JBoss EAP Development Guide.
5.18.5. Migrieren des Clustering-HA-Singletons
In JBoss EAP 6 gab es keine öffentliche API für den clusterweiten HA-Singleton-Service. Wenn Sie die privaten org.jboss.as.clustering.singleton.*
Klassen verwendet haben, müssen Sie für die Migration Ihrer Applikationen zu JBoss EAP 7 Ihren Code ändern, um die neuen öffentlichen org.wildfly.clustering.singleton.*
Pakete zu verwenden.
For more information about how to implement an HA singleton, see HA Singleton Service in the Development Guide for JBoss EAP.