Red Hat Training

A Red Hat training course is available for Red Hat JBoss Enterprise Application Platform

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 eine webservices.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.

EigenschaftTypBeschreibung

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 Keep-Alive oder close genutzt werden soll.

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 Paket org.apache.wss4j.common.ext verlegt wurde.
  • Die meisten der SAML-Bean-Objekte vom Paket org.apache.ws.security.saml.ext wurden in das Paket org.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 auch ActAs-Tokens. Infolgedessen müssen gültige Werte für Benutzername und Passwort im UsernameToken angegeben werden, das für das ActAs-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 eine setRequireBearerSignature()-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 Systemeigenschaft org.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.

Anmerkung

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.

Anmerkung

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 und SignedOutput für resteasy-crypto müssen den Content-Type auf multipart/signed gesetzt haben, entweder im Request- oder im Response-Objekt oder durch Verwendung der Annotation @Consumes oder @Produces.
  • SignedOutput und SignedInput können dazu verwendet werden, um das application/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-Typ text/plain ist, wird SignedOutput 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 AusnahmeErsatz-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 dem bean-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 den bean-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 dem bean-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
Typenhandhabung
  • Integrierte org.hibernate.type.descriptor.sql.SqlTypeDescriptor-Implementierungen registrieren sich nicht mehr automatisch bei der org.hibernate.type.descriptor.sql.SqlTypeDescriptorRegistry. Applikationen, die angepasste SqlTypeDescriptor-Implementierungen verwenden, welche die integrierten Implementierungen erweitern und auf dieses Verhalten angewiesen sind, müssen aktualisiert werden, um selbst SqlTypeDescriptorRegistry.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 Datei hbm.xml definiert sind und Sie javax.persistence.EnumType.STRING name-mapping möchten, muss diese Konfiguration ausdrücklich angegeben werden. Nutzen Sie dazu entweder die Einstellung useNamed(true) oder geben Sie einen VARCHAR-Wert von 12 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 die org.hibernate.Transaction Implementierung nun mit einem org.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 Eigenschaft hibernate.transaction.factory_class (die jetzt veraltet ist) und verwiesen auf einen org.hibernate.engine.transaction.spi.TransactionFactory-FQN (vollständigen Namen). Mit Hibernate ORM 5 spezifizieren Sie die Einstellung hibernate.transaction.coordinator_class und verweisen auf einen org.hibernate.resource.transaction.TransactionCoordinatorBuilder. Siehe org.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.

      Wichtig

      If 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 to jdbc 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 the hibernate.transaction.coordinator_class property value to jta or provide a custom org.hibernate.resource.transaction.TransactionCoordinatorBuilder that builds a org.hibernate.resource.transaction.TransactionCoordinator that properly coordinates with JTA-based transactions.

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 von cfg.xml geladenen Eigenschaften haben die Namen bislang nicht mit dem Präfix hibernate 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 aus org.hibernate.envers.boot.internal.EnversService entfernt.
  • Die Methodenparameter AuditStrategy wurden geändert, um die hinfällige AuditConfiguration zu entfernen und den neuen EnversService zu verwenden.
  • Verschiedene Klassen und Schnittstellen im org.hibernate.hql.spi-Paket und Unterpaketen wurden verlegt in das neue Paket org.hibernate.hql.spi.id. Dazu gehört die Klasse MultiTableBulkIdStrategy sowie die Schnittstellen AbstractTableBasedBulkIdHandler, TableBasedDeleteHandlerImpl und TableBasedUpdateHandlerImpl 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 Methode org.hibernate.cache.spi.access.AccessType.getExternalName() anstelle der Aufzählungskonstanten org.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 Modul hibernate-search-engine in das Modul hibernate-search-orm verlegt. Andere Integratoren sollten ausschließlich SearchIntegrator verwenden, was das veraltete SearchFactoryIntegrator ersetzt.
  • Der Aufzählungswert SpatialMode.GRID wurde umgenannt zu SpatialMode.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 Beispiel org.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 von ServiceManager, Service, Startable und Stoppable 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 Lucenes IndexUpgrader 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 den null-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 KlassenNeue 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
SchnittstelleBeschreibung

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
KlasseBeschreibung

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ählungBeschreibung

org.hibernate.search.annotations.FieldCacheType

Entfernen Sie die veraltete Annotation CacheFromIndex. Siehe Veraltete Annotationen in Hibernate Search.

Veraltete Annotationen in Hibernate Search
AnnotationBeschreibung

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
MethodeBeschreibung

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 field().numericField() auf.

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 FuzzyContext.withEditDistanceUpTo(int).

Veraltete Konstruktoren in Hibernate Search
KonstruktorBeschreibung

org.hibernate.search.cfg.NumericFieldMapping(PropertyDescriptor, EntityDescriptor, SearchMapping)

Verwenden Sie stattdessen NumericFieldMapping.NumericFieldMapping(String, PropertyDescriptor, EntityDescriptor, SearchMapping).

Ä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.

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 als 8080 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 einen remote-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.

Wichtig

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.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.

Anmerkung

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.

Tabelle 5.1. Ersatz für veraltete Logging-Annotationen

Veraltete KlasseErsatzklasse

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 und exclude der Elemente imports und exports verwenden, um das Klassenladen in der module.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.

KonfigurationselementBeschreibung der Änderung

<max-active-sessions/>

Bislang schlug die Session-Erstellung fehl, falls dadurch die Anzahl der aktiven Sessions den in <max-active-sessions/> definierten Wert überstiegen worden wäre.

In der neuen Implementierung wird <max-active-sessions/> dazu verwendet, um Session-Passivierung zu ermöglichen. Falls durch die Erstellung einer neuen Session die Anzahl der aktiven Sessions den <max-active-sessions/> Wert übersteigen würde, so wird die älteste, dem Session-Manager bekannte Session passiviert, um Platz für die neue Session zu schaffen.

<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 <max-active-sessions/> definiert wird.

<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 <max-active-sessions/> einzuhalten.

<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 instance-id des Knotens, der die jeweilige Anfrage handhabte, der jsessionid angefügt (um dann von Lastverteilern wie mod_jk, mod_proxy_balancer und mod_cluster verwendet zu werden), abhängig von dem für <use-jk/> angegebenen Wert.

In der neuen Implementierung wird die instance-id, sofern definiert, immer der jsessionid angefügt.

<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-mode/> als INSTANT oder INTERVAL konfigurieren. Durch die asynchrone Replikation von Infinispan wird diese Konfigurationsoption jedoch hinfällig.

<snapshot-interval/>

Dies war nur relevant für <snapshot-mode>INTERVAL</snapshot-mode>. Da <snapshot-mode/> jedoch hinfällig ist, wurde diese Option ebenfalls obsolet.

<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 zur jboss-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.
Anmerkung

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.