Guide de développement
À utiliser dans Red Hat JBoss Enterprise Application Platform 6
Résumé
Chapitre 1. Introduction au développement d'applications Copier lienLien copié sur presse-papiers!
1.1. Introduction Copier lienLien copié sur presse-papiers!
1.1.1. Red Hat JBoss Enterprise Application Platform 6 Copier lienLien copié sur presse-papiers!
1.2. Conditions préalables Copier lienLien copié sur presse-papiers!
1.2.1. Familiarisez vous avec Java Enterprise Edition 6 Copier lienLien copié sur presse-papiers!
1.2.1.1. Les Profils EE 6 Copier lienLien copié sur presse-papiers!
1.2.1.2. Web Profil de Java Enterprise Edition 6 Copier lienLien copié sur presse-papiers!
Conditions préalables de Java EE 6 Web Profile
- Java Platform, Enterprise Edition 6
Technologies Java Web
- Servlet 3.0 (JSR 315)
- JSP 2.2 et Expression Language (EL) 1.2
- JavaServer Faces (JSF) 2.1 (JSR 314)
- Java Standard Tag Library (JSTL) for JSP 1.2
- Débogage du support pour les autres langages 1.0 (JSR 45)
Enterprise Application Technologies
- Contexts and Dependency Injection (CDI) (JSR 299)
- Injection de dépendance dans Java (JSR 330)
- Enterprise JavaBeans 3.1 Lite (JSR 318)
- Java Persistence API 2.0 (JSR 317)
- Annotations communes de la Plateforme Java 1.1 (JSR 250)
- Java Transaction API (JTA) 1.1 (JSR 907)
- Bean Validation (JSR 303)
1.2.1.3. Java Enterprise Edition 6 Full Profile Copier lienLien copié sur presse-papiers!
Items inclus dans EE 6 Full Profile
- EJB 3.1 (not Lite) (JSR 318)
- Java EE Connector Architecture 1.6 (JSR 322)
- Java Message Service (JMS) API 1.1 (JSR 914)
- JavaMail 1.4 (JSR 919)
Technologies Service Web
- Jax-RS RESTful Web Services 1.1 (JSR 311)
- Implémentation d'Enterprise Web Services 1.3 (JSR 109)
- JAX-WS Java API for XML-Based Web Services 2.2 (JSR 224)
- Java Architecture pour XML Binding (JAXB) 2.2 (JSR 222)
- Web Services Metadata pour Java Platform (JSR 181)
- Les API Java pour XML-based RPC 1.1 (JSR 101)
- Les API Java pour XML Messaging 1.3 (JSR 67)
- Java API pour les Registres XML (JAXR) 1.0 (JSR 93)
Technologies de Gestion et de Sécurité
- Interface Fournisseur Service Java Authentification pour Conteneurs 1.0 (JSR 196)
- Contrat Java Authentication Contract pour les Conteneurs 1.3 (JSR 115)
- Déploiement Application Java EE 1.2 (JSR 88)
- J2EE Management 1.1 (JSR 77)
1.2.2. Les modules et le système de chargement de la nouvelle classe modulaire de JBoss EAP 6. Copier lienLien copié sur presse-papiers!
1.2.2.1. Modules Copier lienLien copié sur presse-papiers!
- Modules statiques
- Les modules statiques sont prédéfinis dans le répertoire
EAP_HOME/modules/du serveur d'applications. Chaque sous-répertoire représente un module et contient un sous-fichier de configurationmain/qui contient un fichier de configuration (module.xml) et tous les fichiers JAR requis. Le nom du module est défini dans le fichiermodule.xml. Toutes les API fournies par le serveur de l'application sont des modules statiques, y compris les API Java EE, et les autres API comme JBoss Logging.Exemple 1.1. Exemple de fichier module.xml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Le nom du module,com.mysql, doit correspondre à la structure du répertoire du module, à l'excepté du nom de sous-répertoiremain/.Les modules fournis dans les distributions JBoss EAP se trouvent dans un répertoiresystemse trouvant lui-même dans le répertoireJBOSS_HOME/modules. Cela les rend séparés de tout module fourni par une tierce partie.Tout produit mis en couche de Red Hat, se superposant sur JBoss EAP 6.1 ou version supérieure installera également leurs modules dans le répertoiresystem.La création de modules statiques personnalisés peut être utile si plusieurs applications sont déployées sur un même serveur utilisant les mêmes bibliothèques de tierce partie. Au lieu d'un regroupement de ces bibliothèques pour chaque application, un module contenant ces bibliothèques peut être créé et installé par l'administrateur JBoss. Les applications peuvent ensuite déclarer une dépendance explicite sur les modules statiques personnalisés.Les utilisateurs doivent s'assurer que les modules personnalisés soient installés dans le répertoireJBOSS_HOME/modules, en utilisant un répertoire par couche de modules. Cela garantit que les versions personnalisées de modules qui existent déjà dans le répertoiresystemsoient bien chargées à la place des versions fournies. Ainsi, les modules utilisateur auront la priorité sur les modules fournis par le système.Si vous utilisez la variable d'environnementJBOSS_MODULE_PATHpour changer les emplacements où JBoss EAP cherche les modules, le produit ira chercher dans une structure de sous-répertoiresystemdans un des emplacements spécifiés. Une structure de sous-répertoiresystemdoit exister quelquepart dans les emplacements spécifiés dansJBOSS_MODULEPATH. - Modules dynamiques
- Les modules dynamiques sont créés et chargés par le serveur d'applications pour chaque déploiement JAR ou WAR (ou sous-déploiement d'un EAR). Le nom d'un module dynamique est dérivé du nom de l'archive déployée. Comme les déploiements sont chargés sous forme de modules, ils peuvent configurer des dépendances et peuvent être utilisés comme dépendances par d'autres déploiements.
1.3. Installer l'environnement de développement Copier lienLien copié sur presse-papiers!
1.3.1. Télécharger et installer Red Hat JBoss Developer Studio Copier lienLien copié sur presse-papiers!
1.3.1.1. Installer Red Hat JBoss Developer Studio Copier lienLien copié sur presse-papiers!
1.3.1.2. Téléchargez Red Hat JBoss Developer Studio Copier lienLien copié sur presse-papiers!
- Visitez https://access.redhat.com/.
- Sélectionnez du menu en haut de la page.
- Cherchez
Red Hat JBoss Developer Studiodans la liste et cliquez dessus. - Sélectionnez la version appropriée et cliquez sur .
1.3.1.3. Installer Red Hat JBoss Developer Studio Copier lienLien copié sur presse-papiers!
- Conditions préalables :
Procédure 1.1. Installer Red Hat JBoss Developer Studio
- Ouvrir un terminal.
- Aller dans le répertoire qui contient le fichier téléchargé
.jar. - Exécuter la commande suivante pour lancer le GUI d'installation.
java -jar jbdevstudio-build_version.jar
java -jar jbdevstudio-build_version.jarCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Cliquer sur pour commencer le processus d'installation.
- Sélectionner I accept the terms of this license agreement (J'accepte les conditions de licence) et cliquer sur .
- Ajuster le chemin d'accès de l'installation et cliquer sur .
Note
Si le dossier de chemin d'installation n'existe pas, vous verrez une invite. Cliquer alors sur pour créer le dossier. - Choisir une JVM, ou bien conserver la JVM sélectionnée par défaut, et cliquer sur .
- Ajouter une plateforme d'applications disponible, et cliquer sur .
- Vérifier les informations d'installation et cliquer sur .
- Cliquer sur une fois le processus d'installation terminé.
- Configurer les raccourcis bureau pour Red Hat JBoss Developer Studio et cliquer sur (suivant).
- Cliquer sur le bouton (Terminé).
1.3.1.4. Démarrer Red Hat JBoss Developer Studio Copier lienLien copié sur presse-papiers!
- Conditions préalables :
Procédure 1.2. Commande de démarrage de Red Hat JBoss Developer Studio
- Ouvrir un terminal.
- Aller dans le répertoire d'installation.
- Lancer la commande suivante pour démarrer JBoss Developer Studio :
./jbdevstudio
[localhost]$ ./jbdevstudioCopy to Clipboard Copied! Toggle word wrap Toggle overflow
1.3.1.5. Ajouter le serveur de JBoss EAP en utilisant Define New Server Copier lienLien copié sur presse-papiers!
Procédure 1.3. Ajouter le serveur
- Ouvrir l'onglet Serveurs. S'il n'y a pas d'onglet Serveurs, l'ajouter au panneau comme suit :
- Cliquer sur → → .
- Sélectionner Servers à partir du dossier Server et cliquer sur .
- Cliquer sur le lien No servers are available. Click this link to create a new server... (Aucun serveur disponible. Cliquer sur ce lien pour créer un nouveau serveur...) ou bien, cliquer à droite dans le panneau vide Serveur, et sélectionner → .
Figure 1.1. Ajouter un nouveau serveur - Aucun serveur disponible
- Étendre JBoss Enterprise Middleware et choisir . Saisir un nom de serveur, comme par exemple "JBoss Enterprise Application Platform 6.4", puis cliquer sur pour créer le JBoss Runtime et définir le serveur. La prochaine fois que vous définirez un nouveau serveur, ce dialogue affichera un menu de sélection Server runtime environment avec la nouvelle définition de runtime.
Figure 1.2. Définir un nouveau serveur
- Créer un Adaptateur de serveur pour gérer le démarrage et l'arrêt du serveur. Conserver les valeurs par défaut, et cliquer sur .
Figure 1.3. Créer un nouvel Adpatateur de serveur
- Saisir un nom comme "JBoss EAP 6.4 Runtime". Sous Home Directory, cliquer sur puis, naviguer vers l'emplacement de l'installation de JBoss EAP. Puis, cliquer sur .
Figure 1.4. Ajouter un environnement de runtime du nouveau serveur
Note
Certains quickstarts exigent que vous exécutiez le serveur avec un profil différent ou avec des arguments supplémentaires. Pour déployer un quickstart qui nécessite le profilfull, vous devez définir un nouveau serveur et ajouter un Server Runtime Environment qui spécifiestandalone-full.xmldans le Configuration file. Veillez à bien donner un nom descriptif au nouveau serveur. - Vous permet de configurer les projets existants pour le nouveau serveur. Puisque vous n'avez pas de projet à ce stade, cliquer sur .
Figure 1.5. Modifier les ressources dans le nouveau serveur de JBoss
Le serveur de JBoss EAP est listé dans l'onglet Servers.
Figure 1.6. Le server apparaît sur la liste de serveurs
1.4. Exécuter votre première application Copier lienLien copié sur presse-papiers!
1.4.1. Télécharger les exemples de codes Quickstart Copier lienLien copié sur presse-papiers!
1.4.1.1. Accès aux Quickstarts Copier lienLien copié sur presse-papiers!
JBoss EAP 6 contient une série d'exemples quickstart conçus pour aider les utilisateurs à commencer à rédiger des applications en utilisant les technologies Java EE 6.
Conditions préalables
- Maven 3.0.0 ou versions plus récentes. Pour en savoir plus sur l'installation de Maven, veuillez consulter http://maven.apache.org/download.html.
- Le référentiel JBoss EAP 6 Maven est disponible en ligne, donc il n'est pas utile de le télécharger ou de l'installer localement. Si vous envisagez de l'utiliser en ligne, passer à l'étape suivante. Si vous préférez l'installer dans un référentiel local, consulter : Section 2.2.3, « Installer le référentiel Maven de JBoss EAP 6 localement ».
Procédure 1.4. Télécharger les quickstarts
- Ouvrir un navigateur web, et accéder à cet URL: https://access.redhat.com/jbossnetwork/restricted/listSoftware.html?product=appplatform.
- Trouver "Quickstarts" dans la liste.
- Cliquer sur le bouton pour télécharger un fichier ZIP contenant les exemples.
- Décompressez l'archive dans un répertoire de votre choix.
Les exemples de Java EE Quickstart ont été téléchargés et décompressés. Veuillez consulter le fichier README.md dans le répertoire supérieur des archives Quickstart pour des instructions concernant le déploiement de chaque quickstart.
1.4.2. Exécuter les Quickstarts Copier lienLien copié sur presse-papiers!
1.4.2.1. Exécuter les quickstarts (démarrages rapides) dans Red Hat JBoss Developer Studio Copier lienLien copié sur presse-papiers!
Procédure 1.5. Importer les quickstarts dans Red Hat JBoss Developer Studio
Important
- Si vous ne l'avez pas encore fait, Section 2.3.2, « Configurer le référentiel JBoss EAP 6 Platform Maven Repository par les paramètres de configuration de Maven ».
- Démarrer Red Hat JBoss Developer Studio.
- À partir du menu, sélectionner → .
- Dans la liste sélectionnée, choisir → , puis cliquer sur .
Figure 1.7. Importer les projets Maven existants
- Naviguer vers le répertoire du quickstart que vous souhaitez tester, comme
helloworld, et cliquer sur . La zone de liste Projects verra apparaître le fichierpom.xmldu projet quickstart sélectionné.Figure 1.8. Sélectionner les projets Maven
- Cliquer sur .
Procédure 1.6. Générer et déployer le Quickstart helloworld
helloworld est un des quickstarts les plus simples et représente une bonne façon de vérifier que le serveur JBoss est configuré et exécute correctement.
- Si vous ne voyez pas l'onglet Servers ou si vous n'avez pas encore défini de serveur, suivre les instructions suivantes : Section 1.3.1.5, « Ajouter le serveur de JBoss EAP en utilisant Define New Server ». Si vous avez l'intention de déployer un quickstart qui requiert un profil
fullet des arguments de démarrage supplémentaires, veillez bien à créer un environnement de runtime selon les instructions de quickstart. - Cliquer à droite sur
jboss-helloworldsur l'onglet Project Explorer, puis sélectionner . On vous présentera une liste de choix. Sélectionner .Figure 1.9. Run As - Run on Server
- Sélectionner JBoss EAP 6.1+ Runtime Server de la liste de serveurs, et cliquer sur .
Figure 1.10. Exécuter sur le serveur
- L'écran suivant affiche les ressources qui sont configurées sur le serveur. Le quickstart de
jboss-helloworldest configuré pour vous. Cliquer sur pour déployer le quickstart.Figure 1.11. Modifier les ressources configurées sur le serveur
- Vérifier les résultats.
- Dans l'onglet
Server, le statut de JBoss EAP 6.x Runtime Server passe à[Started, Republish]. - L'onglet Console du serveur affiche des messages détaillant le démarrage du serveur JBoss EAP 6.x et le déploiement du quickstart helloworld.
- Un onglet helloworld apparaîtra avec l'URL http://localhost:8080/jboss-helloworld/HelloWorld et le texte "Hello World!".
- Les messages suivants de la Console confirment le déploiement du fichier
jboss-helloworld.war:Le contexte web enregistré se rajoute àJBAS018210: Register web context: /jboss-helloworld JBAS018559: Deployed "jboss-helloworld.war" (runtime-name : "jboss-helloworld.war")
JBAS018210: Register web context: /jboss-helloworld JBAS018559: Deployed "jboss-helloworld.war" (runtime-name : "jboss-helloworld.war")Copy to Clipboard Copied! Toggle word wrap Toggle overflow http://localhost:8080pour fournir l'URL utilisé pour accéder à l'application qui est déployée.
- Pour vérifier que le Quickstart
helloworlda été déployé correctement dans le serveur JBoss, ouvrir le navigateur web, et accéder à l'application dans l'URL : http://localhost:8080/jboss-helloworld
Procédure 1.7. Exécuter les tests Arquillian du quickstart bean-validation
bean-validation est un exemple de quickstart qui fournit des tests Arquillian.
- Suivre la procédure ci-dessus pour importer le quickstart
bean-validationdans le Red Hat JBoss Developer Studio. - Dans l'onglet Servers, cliquer à droite dans le serveur et sélectionner le bouton pour démarrer le serveur JBoss EAP. Si vous n'apercevez pas l'onglet Servers et ou si vous n'avez pas encore défini de serveur, suivre les instructions suivantes : Section 1.3.1.5, « Ajouter le serveur de JBoss EAP en utilisant Define New Server ».
- Cliquer à droite sur le projet
jboss-bean-validationqui se trouve dans l'onglet Project Explorer et sélectionner . On vous présentera une liste d'options. Sélectionner . - Dans le champ d'entrée Goals du dialogue Edit Configuration, saisir :
clean test -Parq-jbossas-remotePuis cliquer sur .Figure 1.12. Modifier la configuration
- Vérifier les résultats.L'onglet de serveur Console affiche des messages donnant des informations sur le démarrage du serveur JBoss EAP et la sortie des tests Arquillian de quickstart
bean-validation.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.4.2.2. Exécuter les quickstarts par la Ligne de commande Copier lienLien copié sur presse-papiers!
Procédure 1.8. Générer et déployer les quickstarts par la Ligne de commande
- Si vous ne l'avez pas encore fait, Section 2.3.2, « Configurer le référentiel JBoss EAP 6 Platform Maven Repository par les paramètres de configuration de Maven ».
- Vérifier le fichier
README.htmlqui se trouve dans le répertoire racine des quickstarts.Ce fichier contient des informations générales sur les prérequis de systèmes, sur la façon de configurer Maven, comment ajouter des utilisateurs, et comment exécuter les quickstarts. Lisez attentivement avant de commencer.Il contient également un tableau qui répertorie les quickstarts disponibles. Le tableau répertorie chaque nom de quickstart et chaque technologie dont il s'agit. Il y a une brève description pour chaque quickstart et une indication du niveau d'expérience requis pour l'installer. Pour des informations plus détaillées, cliquez sur le nom du quickstart.Certains quickstarts sont conçus pour améliorer ou étendre d'autres quickstarts. Ils sont indiqués dans la colonnePrérequis. Si un quickstart est associé à une liste de prérequis, vous devrez les installer avant d'utiliser le quickstart.Certains quickstart ont besoin de l'installation et de la configuraiton des composants optionnels. Ne pas installer ces composants à moins que le quickstart ne l'exige. - Exécuter le quickstart
helloworldLe quickstarthelloworldest l'un des quickstarts les plus simples, et représente un bon moyen de vérifier si le serveur JBoss est configuré et exécute correctement. Ouvrir le fichierREADME.htmldans la racine du quickstarthelloworld. Il contient des instructions détaillées sur la façon de construire et de déployer le quickstart et accéder à l'application en cours. - Exécuter d'autres quickstarts.Suivre les instructions dans le fichier
README.htmlque se trouve dans le dossier racine de chaque quickstart pour exécuter l'exemple.
1.4.3. Revoir les tutoriels Quickstart Copier lienLien copié sur presse-papiers!
1.4.3.1. Découvrir le Quickstart HelloWorld Copier lienLien copié sur presse-papiers!
Le Quickstart helloworld vous montre comment déployer un simple Servlet dans la plateforme JBoss EAP 6. La logique métier comprend un service fourni sous forme de bean CDI (Contexts and Dependency Injection) qui est injecté dans le Servlet. Ce Quickstart est très simple. Tout ce qu'il se contente de faire est d'imprimer "Hello World" dans une page web. C'est une bonne façon de savoir si vous avez bien configuré et démarré votre serveur.
helloworld.
- Installer Red Hat JBoss Developer Studio en suivant la procédure qui suit : Section 1.3.1.3, « Installer Red Hat JBoss Developer Studio ».
- Configurer Maven pour qu'il puisse être utilisé avec Red Hat JBoss Developer Studio en suivant la procédure qui suit : Section 2.3.3, « Configurer Maven pour utilisation dans Red Hat JBoss Developer Studio ».
- Suivre les procédures suivantes pour importer, créer et déployer le Quickstart
helloworlddans Red Hat JBoss Developer Studio : Section 1.4.2.1, « Exécuter les quickstarts (démarrages rapides) dans Red Hat JBoss Developer Studio » - Vérifier que le Quickstart
helloworldest déployé correctement dans JBoss EAP en ouvrant un navigateur web, et en accédant à l'application dans cet URL : http://localhost:8080/jboss-helloworld
Procédure 1.9. Observer la structure du répertoire
QUICKSTART_HOME/helloworld. Le Quickstart helloworld comprend un Servlet et un bean CDI. Il comprend également un fichier beans.xml qui indique à JBoss EAP 6 comment trouver des beans pour cette application et comment activer le CDI.
- Le fichier
beans.xmlse trouve dans le dossierWEB-INF/qui se trouve dans le répertoiresrc/main/webapp/du Quickstart. - Le répertoire
src/main/webapp/inclut également un fichierindex.htmlqui utilise une simple réactualisation meta pour rediriger le navigateur de l'utilisateur vers le Servlet, qui se trouve à http://localhost:8080/jboss-helloworld/HelloWorld. - Tous les fichiers de configuration de cet exemple se trouvent dans
WEB-INF/, qui se trouve dans le répertoiresrc/main/webapp/de l'exemple. - Notez que le Quickstart n'a pas même besoin d'un fichier
web.xml!
Procédure 1.10. Examiner le code
Vérifier le code HelloWorldServlet
Le fichierHelloWorldServlet.javase trouve dans le répertoiresrc/main/java/org/jboss/as/quickstarts/helloworld/. Le Servlet envoie les informations dans le navigateur.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand Tableau 1.1. Infos HelloWorldServlet Ligne Note 43 Avant Java EE 6, on utilisait un fichier XML pour enregistrer les Servlets. C'est bien plus clean. Tout ce qu'il vous reste à faire est d'ajouter l'annotation @WebServletet de fournir un mappage vers un URL qui est utilisé pour accéder au serveur.46-48 Chaque page web a besoin d'HTML formé correctement. Ce Quickstart utilise les Strings statiques pour écrire les sorties minimum de l'en-tête et du pied de page. 50-51 Ces lignes injectent le bean CDI HelloService, qui génère le message réel. Tant que nous ne changeons pas les API de HelloService, cette approche nous permet de modifier l'implémentation de HelloService à une date ultérieure sans changer l'affichage. 58 Cette ligne appelle le service pour générer le message "Hello World", et l'écrire dans la requête HTTP. Vérifier le code HelloService
Le fichierHelloService.javase trouve dans le répertoiresrc/main/java/org/jboss/as/quickstarts/helloworld/. Ce service est très simple. Il renvoie un message. Nul besoin d'enregistrement d'annotation ou d'XML.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.4.3.2. Découvrir le Quickstart numberguess Copier lienLien copié sur presse-papiers!
Ce Quickstart vous montre comment créer et déployer une simple application de JBoss EAP 6. Cette application ne persiste pas n'importe quelle information. Les informations sont affichées par JSF, et la logique métier est encapsulée dans deux beans CDI. Dans le Quickstart numberguess, vous obtenez 10 tentatives pour deviner un nombre entre 1 et 100. Après chaque tentative, on vous indique si votre estimation est trop élevée ou trop faible.
QUICKSTART_HOME/numberguess. Le Quickstart hnumberguess comprend un certain nombre de beans, des fichiers de configuration et des affichages Facelets (JSF), tout cela dans un package de module WAR.
numberguess.
- Installer Red Hat JBoss Developer Studio en suivant la procédure qui suit : Section 1.3.1.3, « Installer Red Hat JBoss Developer Studio ».
- Configurer Maven pour qu'il puisse être utilisé avec Red Hat JBoss Developer Studio en suivant la procédure qui suit : Section 2.3.3, « Configurer Maven pour utilisation dans Red Hat JBoss Developer Studio ».
- Suivre les procédures suivantes pour importer, créer et déployer le Quickstart
numberguessdans Red Hat JBoss Developer Studio : Section 1.4.2.1, « Exécuter les quickstarts (démarrages rapides) dans Red Hat JBoss Developer Studio » - Vérifier que le Quickstart
numberguessest déployé correctement dans JBoss EAP en ouvrant un navigateur web, et en accédant à l'application dans cet URL : http://localhost:8080/jboss-numberguess
Procédure 1.11. Examiner les fichiers de configuration
WEB-INF/, qui se trouvent dans le répertoire src/main/webapp/ du Quickstart.
- Examiner le fichier
faces-config.xml.Ce Quickstart utilise la version de JSF 2.0 defaces-config.xml. Une version normalisée de Facelets correspond au gestionnaire d'affichage par défaut de JSF 2.0, donc il n'y a pas vraiment grand chose à configurer. JBoss EAP 6 va au-delà de Java EE ici. Il va automatiquement configurer JSF pour vous, si vous incluez ce fichier de configuration. En conséquence, la configuration ne consistera uniquement en l'élément racine :Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Examiner le fichier
beans.xml.Il y a également un fichierbeans.xmlqui indique à JBoss EAP 6 de chercher des beans dans cette application et d'activer le CDI. - Il n'y a pas de fichier
web.xmlNotez que le Quickstart n'a pas même besoin d'un fichierweb.xml!
Procédure 1.12. Examiner le code JSF
.xhtml pour les fichiers source, mais s'occupe des vues rendues par l'extension .jsf.
- Examiner le code
home.xhtml.Le fichierhome.xhtmlse trouve dans le répertoiresrc/main/webapp/.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand Tableau 1.2. Infos JSF Ligne Remarque 36-40 Voici les messages qui peuvent être envoyés par l'utilisateur : "Higher!" et "Lower!" 45-48 Au fur et à mesure que l'utilisateur devine, l'étendue des nombres qu'ils devinent se rétrécit. Cette phrase change pour s'assurer qu'ils connaissent la portée d'une tentative valide. 55-58 Ce champ d'entrée est lié à une propriété de bean qui utilise une expression de valeur. 58 On utilise une liaison de validateur pour s'assurer que l'utilisateur ne mette pas le nombre qu'il devine en dehors de la limite. Si le validateur n'était pas présent, l'utilisateur peut deviner un nombre en dehors de la limite. 59-61 Il doit y avoir un moyen pour que l'utilisateur envoie le nombre qu'il devine au serveur. Ici, on associe une méthode d'action sur le bean.
Procédure 1.13. Examiner les fichiers de classe
src/main/java/org/jboss/as/quickstarts/numberguess/. La déclaration de paquet et les importations ont été exclues de ces listings. La liste complète se trouve dans le code source du Quickstart.
- Vérifier le code du qualificateur
Random.java.Un qualificateur est utilisé pour supprimer l'ambiguïté entre deux beans, qui sont tous deux candidats pour l'injection selon leur type. Pour plus d'informations sur les qualificateurs, se référer à Section 10.2.3.3, « Utiliser un qualificateur pour résoudre une injection ambigue. »Le qualificateur@Randomest utilisé pour injecter un nombre au hasard.Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Vérifier le code du qualificateur
MaxNumber.java.Lequalificateur@MaxNumberest utilisé pour injecter le nombre maximum autorisé.Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Vérifier le code
Generator.java.La classeGeneratorest chargée de créer le nombre aléatoire par une méthode de producteur. Elle indique également le nombre maximum possible par une méthode de producteur. Cette classe reste dans la portée de l'application, donc, vous n'obtenez pas un nombre différent au hasard à chaque fois.Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Vérifier le code
Game.java.La classe session scopedGameest le point d'entrée principal de l'application. Elle est là pour initialiser et réinitialiser le jeu, pour capturer et valider la tentative de numéro de l'utilisateur, et afin de fournir un commentaire de retour à l'utilisateur avec unFacesMessage. Elle utilise une méthode de cycle de vie de post-construction pour initialiser le jeu, en tirant un nombre au hasard du bean@Random Instance<Integer>.Notez l'annotation @Named dans la classe. Cette annotation est uniquement requise quand on veut rendre le bean accessible à une vue JSF via Expression Language (EL), et dans ce cas#{game}.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.4.4. Remplacer l'application web Welcome par défaut Copier lienLien copié sur presse-papiers!
Procédure 1.14. Remplacer l'application web Welcome par défaut par votre propre application web
Désactiver l'application Welcome
Utiliser le script d'interface CLIEAP_HOME/bin/jboss-cli.shpour exécuter la commande suivante. Vous aurez sans doute besoin de modifier un profil de domaine géré, ou retirer une portion de la commande/profile=defaultdu serveur autonome./profile=default/subsystem=web/virtual-server=default-host:write-attribute(name=enable-welcome-root,value=false)
/profile=default/subsystem=web/virtual-server=default-host:write-attribute(name=enable-welcome-root,value=false)Copy to Clipboard Copied! Toggle word wrap Toggle overflow Configurer votre application web par le contexte root.
Afin de configurer votre application web, pour qu'elle utilise (/) comme adresse URL, modifier son fichierjboss-web.xml, qui se trouve dans le répertoireMETA-INF/ouWEB-INF/. Remplacer sa directive<context-root>par une autre directive qui ressemble à ce qui suit.<jboss-web> <context-root>/</context-root> </jboss-web><jboss-web> <context-root>/</context-root> </jboss-web>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Déployer votre application.
Déployer votre application pour le groupe de serveurs ou le serveur que vous avez modifié lors de la première étape. L'application est maintenant disponible surhttp://SERVER_URL:PORT/.
Chapitre 2. Guide Maven Copier lienLien copié sur presse-papiers!
2.1. Pour en savoir plus sur Maven Copier lienLien copié sur presse-papiers!
2.1.1. Le référentiel Maven Copier lienLien copié sur presse-papiers!
http:// pour les référentiels qui se trouvent sur un serveur HHTP ou file:// pour les référentiels qui se trouvent dans un serveur de fichiers.
2.1.2. Le fichier POM Maven Copier lienLien copié sur presse-papiers!
pom.xml requiert certaines options de configuration définissant la valeur par défaut. Voir Section 2.1.3, « Conditions minimum pour un fichier POM Maven » pour plus de détails.
pom.xml est disponible sur le lien http://maven.apache.org/maven-v4_0_0.xsd.
2.1.3. Conditions minimum pour un fichier POM Maven Copier lienLien copié sur presse-papiers!
Les conditions minimum pour un fichier pom.xml sont les suivantes :
- project root
- modelVersion
- groupId - l'id du groupe du projet
- artifactId - l'id de l'artifact (projet)
- version - la version de l'artifact dans le groupe spécifié
Un fichier pom.xml de base devrait resssembler à ceci :
2.1.4. Le fichier des configurations de Maven Copier lienLien copié sur presse-papiers!
settings.xml contient des informations de configuration spécifiques à l'utilisateur pour Maven. Il contient des informations qui ne devraient pas être distribuées dans le fichier pom.xml, comme l'identité du dévelopeur, l'information sur le proxy, l'emplacement du référentiel local, et autres paramètres propres à un utilisateur.
settings.xml.
- Dans l'installation Maven
- Le fichier de configuration se trouve dans le répertoire
M2_HOME/conf/. On les appelle les paramètresglobaux. Le fichier de configuration Maven par défaut est un modèle qui peut être copié et utilisé comme point de départ pour le fichier des paramètres utilisateur. - Dans l'installation de l'utilisateur
- Le fichier de configuration se trouve dans le répertoire
USER_HOME/.m2/. Si les fichierssettings.xmlet Maven existent tous les deux, leurs contenus seront fusionnés. S'il y a une intersection, le fichier utilisateursettings.xmlaura priorité.
settings.xml Maven :
settings.xml à l'adresse suivante http://maven.apache.org/xsd/settings-1.0.0.xsd.
2.2. Installer le Référentiel JBoss Maven et Maven Copier lienLien copié sur presse-papiers!
2.2.1. Télécharger et installer Maven Copier lienLien copié sur presse-papiers!
- Aller dans Apache Maven Project - Download Maven et télécharger la dernière distribution de votre système d'exploitation.
- Voir la documentation Maven pour les informations sur le façon de télécharger et d'installer Apache Maven sur votre système d'exploitation.
2.2.2. Installer le référentiel Maven de JBoss EAP 6 Copier lienLien copié sur presse-papiers!
2.2.3. Installer le référentiel Maven de JBoss EAP 6 localement Copier lienLien copié sur presse-papiers!
Le référentiel de JBoss EAP 6 Maven est disponible en ligne. Il n'est pas donc nécessaire de le télécharger et de l'installer localement. Toutefois, si vous préférez installer le référentiel JBoss EAP Maven localement, il y a trois façons de procéder : sur votre système de fichiers local, sur le serveur Web Apache, ou avec un gestionnaire de référentiel Maven. Cet exemple couvre les étapes pour télécharger le référentiel JBoss EAP 6 Maven sur le système de fichiers local. Cette option est facile à configurer et vous permet d'obtenir d'être opérationnel rapidement sur votre ordinateur local. Il peut vous aider à vous familiariser à l'utilisation de Maven pour le développement, mais n'est pas recommandé pour les environnements de production en équipes.
Procédure 2.1. Télécharger et installer le référentiel Maven de JBoss EAP 6 sur le système de fichier local.
- Ouvrir un navigateur web, et accéder à cet URL: https://access.redhat.com/jbossnetwork/restricted/listSoftware.html?product=appplatform.
- Chercher "Red Hat JBoss Enterprise Application Platform VERSION Maven Repository" dans la liste.
- Cliquer sur le bouton pour télécharger un fichier
.zipcontenant le référentiel. - Décompresser le fichier sur votre système de fichiers local dans un répertoire de votre choix.
Ceci crée un répertoire de référentiel Maven appelé jboss-eap-version-maven-repository.
Important
settings.xml de Maven. Chaque référentiel local doit être configuré dans sa propre balise <repository>.
Important
repository/ cache, qui se situe sous le répertoire .m2/ avant de tenter d'utiliser le nouveau répertoire Maven.
2.2.4. Installer le référentiel Maven de JBoss EAP 6 à utiliser avec Appache httpd Copier lienLien copié sur presse-papiers!
Il vous faut configurer Apache httpd. Voir la documentation Apache HTTP Server Project pour obtenir des instructions.
Procédure 2.2. Télécharger l'archive ZIP du référentiel Maven de JBoss EAP 6
- Ouvrir un navigateur web, et accéder à cet URL: https://access.redhat.com/jbossnetwork/restricted/listSoftware.html?product=appplatform.
- Chercher "Red Hat JBoss Enterprise Application Platform <VERSION> Maven Repository" dans la liste.
- Cliquer sur le bouton pour télécharger un fichier
.zipcontenant le référentiel. - Décompresser les fichiers dans un répertoire qui soit accessible au serveur Apache.
- Configurer Apache pour lui donner la permission écriture et pour permettre la navigation dans le répertoire créé.
Cela permet à un environnement multi-utilisateurs d'accéder à un référentiel Maven sur Apache httpd.
Note
2.2.5. Installer le référentiel Maven de JBoss EAP 6 en utilisant le gestionnaire de référentiels Nexus Maven Copier lienLien copié sur presse-papiers!
Procédure 2.3. Télécharger l'archive ZIP du référentiel Maven de JBoss EAP 6
- Ouvrir un navigateur web, et accéder à cet URL: https://access.redhat.com/jbossnetwork/restricted/listSoftware.html?product=appplatform.
- Chercher "Red Hat JBoss Enterprise Application Platform <VERSION> Maven Repository" dans la liste.
- Cliquer sur le bouton pour télécharger un fichier
.zipcontenant le référentiel. - Décompresser les fichiers dans un répertoire de votre choix sur le serveur qui héberge Nexus.
Procédure 2.4. Ajouter le référentiel Maven de JBoss EAP 6 en utilisant le gestionnaire de référentiels Nexus Maven
- Connectez-vous à Nexus en tant qu'administrateur.
- Sélectionner la section Référentiels à partir du menu → qui se trouve à gauche du gestionnaire de référentiels.
- Cliquer sur le menu déroulant Ajouter..., puis sélectionner Référentiel hébergé.
- Donner un nom et une ID au nouveau référentiel.
- Saisir le chemin du disque qui mène au référentiel décompressé dans le champ d'emplacement Remplacement du stockage local.
- Continuer si vous souhaitez que l'artéfact soit disponible dans un groupe de référentiels. Ne pas continuer avec cette procédure si ce n'est pas ce que vous souhaitez.
- Sélectionner le groupe de référentiels.
- Cliquer sur l'onglet Configurer.
- Déplacez le nouveau référentiel JBoss Maven de la liste Référentiels disponibles vers la liste Référentiels de groupes ordonnancés sur la gauche.
Note
Notez que l'ordre de cette liste détermine la priorité de recherche d'artefacts Maven.
Le référentiel est configuré par le gestionnaire de référentiels Maven Nexus.
2.2.6. Gestionnaires de référentiels Maven Copier lienLien copié sur presse-papiers!
- Ils donnent la possibilité de configurer des proxys entre votre organisation et des référentiels Maven à distance, ce qui offre un grand nombre d'avantages, parmi lesquels des déploiements plus rapides et plus efficaces et un meilleur niveau de contrôle sur ce qui est téléchargé par Maven.
- Ils fournissent des destinations de déploiement pour les artefacts que vous aurez vous-même générés, permettant ainsi une collaboration entre différentes équipes de développement au sein d'une organisation.
Gestionnaires de référentiels Maven les plus communément utilisés
- Sonatype Nexus
- Voir Sonatype Nexus: Manage Artifacts pour obtenir plus d'informations sur Nexus.
- Artifactory
- Voir Artifactory Open Source pour obtenir plus d'informations sur Artifactory.
- Apache Archiva
- Voir Apache Archiva: The Build Artifact Repository Manager pour obtenir plus d'informations sur Apache Archiva.
2.3. Utiliser le Référentiel Maven Copier lienLien copié sur presse-papiers!
2.3.1. Configurer le référentiel Maven 6 de JBoss EAP Copier lienLien copié sur presse-papiers!
Il existe deux approches pour amener Maven à utiliser le référentiel Maven de JBoss EAP 6 dans votre projet :
- Vous pouvez configurer les référentiels dans les paramètres globaux ou d'utilisateur de Maven.
- Vous pouvez configurer les référentiels dans le fichier POM du projet.
Procédure 2.5. Configurer les paramètres Maven pour qu'ils utilisent le référentiel Maven de JBoss EAP 6
Configurer le référentiel Maven par les paramètres Maven
Nous vous conseillons cette dernière approche. Les paramètres Maven utilisés avec un gestionnaire de référentiel ou un référentiel sur un serveur partagé offrent un meilleur contrôle et une meilleure gestion des projets. Les paramètres offrent également la capacité d'utiliser un miroir alternatif pour rediriger toutes les demandes de recherche pour un référentiel spécifique vers un gestionnaire de référentiel sans changer les fichiers du projet. Pour plus d'informations concernant les miroirs, veuillez consulter http://maven.apache.org/guides/mini/guide-mirror-settings.html.Cette méthode de configuration s'applique à tous les projets Maven, tant que le fichier POM du projet ne contient pas de configuration de référentiel.Configurer le référentiel Maven pour qu'il utilise le fichier POM du projet.
Cette méthode de configuration est généralement déconseillée. Si vous décidez de configurer des référentiels dans le fichier POM de votre projet, planifiez de manière prudente et souvenez-vous que cela pourrait ralentir votre build et que vous pourriez vous retrouver avec des artefacts ne provenant pas du référentiel attendu.Note
Dans le cas d'une entreprise, où un gestionnaire de référentiel est généralement utilisé, Maven doit interroger tous les artefacts pour tous les projets en utilisant ce gestionnaire. Maven utilise tous les référentiels déclarés pour trouver les artéfacts manquants. Par conséquent, s'il ne peut trouver ce qu'il cherche, il pourra le chercher dans la centrale de référentiels (définie dans le fichier POM parent intégré). Pour remplacer cet emplacement central, vous pouvez ajouter une définition aveccentralde manière à ce que la centrale de référentiels devienne également votre gestionnaire de référentiel. Cela fonctionne bien avec les projets établis, mais pose un problème pour les projets vierges ou récents puisque cela crée une dépendance cyclique.Les fichiers POM inclus de manière transitive représentent également un problème avec ce type de configuration. Maven doit interroger ces référentiels externes pour trouver les artefacts manquants. Non seulement cela ralentira votre build, mais vous fera également perdre le contrôle sur la provenance de vos artefacts et risquera d'endommager votre build.Cette méthode de configuration remplace les configuration utilisateur et globales pour le projet configuré.
2.3.2. Configurer le référentiel JBoss EAP 6 Platform Maven Repository par les paramètres de configuration de Maven Copier lienLien copié sur presse-papiers!
- Vous pouvez modifier les paramètres Maven. Cela amène Maven à utiliser la configuration à travers tous les projets.
- Vous pouvez configurer le fichier POM du projet. Cela limite la configuration au projet particulier.
Note
- Système de fichiers
- file:///path/to/repo/jboss-eap-6.x-maven-repository
- Apache Web Server
- http://intranet.acme.com/jboss-eap-6.x-maven-repository/
- Gestionnaire de référentiel Nexus
- https://intranet.acme.com/nexus/content/repositories/jboss-eap-6.x-maven-repository
Procédure 2.6. Configurer Maven par les paramètres fournis dans les exemples Quickstart
settings.xml configuré pour utiliser le référentiel JBoss EAP 6 Maven en ligne. Il s'agit de l'approche la plus simple.
- Cette procédure remplace le fichier de configuration Maven existant, donc vous devrez sauvegarder le fichier
settings.xmlMaven existant.- Chercher le répertoire d'installation Maven qui corresponde à votre système d'exploitation. Il se trouve normalement dans le répertoire
USER_HOME/.m2/.- Dans Linux ou Mac, c'est:
~/.m2/ - Pour Windows, c'est :
\Documents and Settings\USER_NAME\.m2\ou\Users\USER_NAME\.m2\
- Si vous avez un fichier
USER_HOME/.m2/settings.xmlexistant, renommer le et faire une copie de sauvegarde afin de pouvoir le restaurer plus tard.
- Télécharger et décompresser les exemples quickstart fournis dans JBoss EAP 6. Pour plus d'informations, voir Section 1.4.1.1, « Accès aux Quickstarts »
- Copier le fichier
QUICKSTART_HOME/settings.xmldans le répertoireUSER_HOME/.m2/. - Si vous modifiez le fichier
settings.xmltandis que Red Hat JBoss Developer Studio est en cours d'exécution, suivre la procédure ci-dessous intitulée Refresh the JBoss Developer Studio User Settings.
Procédure 2.7. Modifier et configurer les paramètres Maven manuellement pour qu'ils utilisent le référentiel Maven de JBoss EAP 6 en ligne
- Chercher le répertoire d'installation Maven qui corresponde à votre système d'exploitation. Il se trouve normalement dans le répertoire
USER_HOME/.m2/.- Dans Linux ou Mac, c'est
~/.m2/ - Pour Windows, c'est
\Documents and Settings\USER_NAME\.m2\ou\Users\USER_NAME\.m2\
- Si vous ne trouvez pas de fichier
settings.xml, copier le fichiersettings.xmldu répertoireUSER_HOME/.m2/conf/dans le répertoireUSER_HOME/.m2/. - Copier l'XML suivant dans l'élément
<profiles>du fichier.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Copier l'XML suivant dans l'élément<activeProfiles>desettings.xml.<activeProfile>jboss-ga-repository</activeProfile> <activeProfile>jboss-earlyaccess-repository</activeProfile>
<activeProfile>jboss-ga-repository</activeProfile> <activeProfile>jboss-earlyaccess-repository</activeProfile>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Si vous modifiez le fichier
settings.xmltandis que Red Hat JBoss Developer Studio est en cours d'exécution, suivre la procédure ci-dessous intitulée Refresh the JBoss Developer Studio User Settings.
Procédure 2.8. Configurer les paramètres pour pouvoir utiliser un référentiel JBoss EAP installé localement
- Chercher le répertoire d'installation Maven qui corresponde à votre système d'exploitation. Il se trouve normalement dans le répertoire
USER_HOME/.m2/.- Dans Linux ou Mac, c'est
~/.m2/ - Pour Windows, c'est
\Documents and Settings\USER_NAME\.m2\ou\Users\USER_NAME\.m2\
- Si vous ne trouvez pas de fichier
settings.xml, copier le fichiersettings.xmldu répertoireUSER_HOME/.m2/conf/dans le répertoireUSER_HOME/.m2/. - Copier l'XML suivant dans l'élément
<profiles>du fichiersettings.xml. Veillez bien à changer l'<url>à l'emplacement de référentiel lui-même.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Copier l'XML suivant dans l'élément<activeProfiles>desettings.xml.<activeProfile>jboss-eap-repository</activeProfile>
<activeProfile>jboss-eap-repository</activeProfile>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Si vous modifiez le fichier
settings.xmltandis que Red Hat JBoss Developer Studio est en cours d'exécution, suivre la procédure ci-dessous intitulée Refresh the JBoss Developer Studio User Settings.
Procédure 2.9. Réactualiser les paramètres de configuration d'utilisateur de Red Hat JBoss Developer Studio
settings.xml tandis que Red Hat JBoss Developer Studio est en cours d'exécution, vous devrez réactualiser les paramètres de configuration d'utilisateur.
- À partir du menu, sélectionner → .
- Dans la fenêtre Window Preferences, étendre Maven et sélectionner User Settings.
- Cliquer sur le bouton (Mise à jour Configuration) pour réactualiser les configurations utilisateur de Maven dans Red Hat JBoss Developer Studio.
Figure 2.1. Mise à jour des paramètres de configuration de l'utilisateur Maven
Important
- Missing artifact ARTIFACT_NAME
- [ERROR] Failed to execute goal on project PROJECT_NAME; Could not resolve dependencies for PROJECT_NAME
~/.m2/repository/ dans Linux, et dans le sous-répertoire %SystemDrive%\Users\USERNAME\.m2\repository\ dans Windows.
2.3.3. Configurer Maven pour utilisation dans Red Hat JBoss Developer Studio Copier lienLien copié sur presse-papiers!
Procédure 2.10. Configurer Maven dans Red Hat JBoss Developer Studio
- Cliquer sur →, puis JBoss Tools et sélectionner JBoss Maven Integration.
Figure 2.2. Panneau d'intégration de JBoss Maven dans la fenêtre Préférences
- Cliquer sur .
- Cliquer sur pour configurer le référentiel de JBoss GA Tech Preview Maven. Remplir les champs de
Add Maven Repositorycomme suit :- Définir les valeurs de Profile ID, Repository ID, et Repository Name à
jboss-ga-repository. - Définir la valeur de Repository URL à
http://maven.repository.redhat.com/techpreview/all. - Cliquer sur la case pour activer le référentiel Maven.
- Cliquer sur
Figure 2.3. Ajouter le référentiel Maven - JBoss Tech Preview
- Cliquer sur pour configurer le référentiel JBoss Early Access Maven. Remplir les champs de
Add Maven Repositorycomme suit :- Définir les valeurs de Profile ID, Repository ID, et Repository Name à
jboss-earlyaccess-repository. - Définir la valeur de Repository URL à
http://maven.repository.redhat.com/techpreview/all. - Cliquer sur la case pour activer le référentiel Maven.
- Cliquer sur
Figure 2.4. Ajouter le référentiel Maven - JBoss Early Access
- Vérifier les référentiels et cliquer sur .
Figure 2.5. Vérifier les référentiels Maven
- Le message suivant appraîtra "Are you sure you want to update the file 'MAVEN_HOME/settings.xml'?". Cliquer sur pour mettre les paramètres de configuration à jour. Clqiuer sur pour fermer la boîte de dialogue.Le référentiel Maven est maintenant configuré pour utilisation dans Red Hat JBoss Developer Studio
2.3.4. Configurer le référentiel JBoss EAP 6 Platform Maven Repository par le Projet POM Copier lienLien copié sur presse-papiers!
- Vous pouvez modifier les paramètres Maven.
- Vous pouvez configurer le fichier POM du projet.
pom.xml. Cette méthode de configuration remplace les configurations Utilisateur et Globales.
Note
central de manière à ce que la centrale de référentiels devienne également votre gestionnaire de référentiel. Cela fonctionne bien avec les projets établis, mais pose un problème pour les projets vierges ou récents puisque cela crée une dépendance cyclique.
Note
- Système de fichiers
- file:///path/to/repo/jboss-eap-6.x-maven-repository
- Apache Web Server
- http://intranet.acme.com/jboss-eap-6.x-maven-repository/
- Gestionnaire de référentiel Nexus
- https://intranet.acme.com/nexus/content/repositories/jboss-eap-6.x-maven-repository
- Ouvrir le fichier
pom.xmlde votre projet dans un éditeur de texte. - Ajouter la configuration du référentiel suivant. S'il y a déjà une configuration
<repositories>qui se trouve dans le fichier, lui ajouter l'élément<repository>. Veillez bien à modifier l'<url>pour qu'il corresponde bien à l'emplacement du référentiel.Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Ajouter la configuration de référentiel de plug-in suivante. S'il existe déjà une configuration
<pluginRepositories>dans le fichier, lui ajouter l'élément<pluginRepository>.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.3.5. Gestion des dépendances du projet Copier lienLien copié sur presse-papiers!
pom.xml (POM) qui indique les versions de toutes les dépendances d'exécution d'un module donné. Les dépendances de versions sont listées dans la section de gestion des dépendances du fichier.
groupId:artifactId:version (GAV) à la section de gestion des dépendances du fichier pom.xml du projet et en spécifiant <scope>import</scope> et les valeurs de l'élément <type>pom</type>.
Note
fournie. C'est parce que ces classes sont fournies par le serveur d'applications en cours d'exécution et qu'il n'est pas nécessaire de les empaqueter avec l'application utilisateur.
Artéfacts Maven pris en charge
-redhat, par exemple 1.0.0-redhat-1.
pom.xml de configuration de build garantit que le build utilise l'artefact binaire correct pour la génération de builds locaux et pour le testing. Notez qu'un artefact avec une version -redhat ne fait pas nécessairement partie de l'API public prise en charge et peut changer à l'avenir au cours des révisions. Pour plus d'informations sur l'API public pris en charge, voir la documentation JavaDoc incluse dans la sortie.
<version/>. Cependant, il est recommandé d'utiliser la gestion des dépendances Maven pour configurer les versions de dépendances.
Gestion des dépendances
JBoss JavaEE Specs Bom de nomenclature
jboss-javaee-6.0 contient les JAR de spécification JAVA EE utilisés dans JBoss EAP.
3.0.2.Final-redhat-x de la NOMENCL jboss-javaee-6.0.
Les nomenclatures JBoss EAP BOM et les Quickstarts
| IdArtéfact Maven | Description |
|---|---|
| jboss-javaee-6.0-with-hibernate | Cette nomenclature BOM s'appuie sur le profil BOM complet de Java EE, ajoutant des projets communautaires Hibernate ORM, Hibernate Search et Hibernate Validator. Elle fournit également des projets d'outil tel que Hibernate JPA Model Gen et le processeur Hibernate Validator Annotation. |
| jboss-javaee-6.0-with-hibernate3 | Cette nomenclature BOM s'appuie sur le profil BOM complet de Java EE, ajoutant des projets communautaires Hibernate 3 ORM, Hibernate Entity Manager (JPA 1.0) et Hibernate Validator. |
| jboss-javaee-6.0-with-logging | Cette nomenclature BOM s'appuie sur le profil BOM complet de Java EE, ajoutant JBoss Logging Tools et Log4j framework. |
| jboss-javaee-6.0-with-osgi | Cette nomenclature BOM s'appuie sur le profil BOM complet de Java EE, ajoutant OSGI. |
| jboss-javaee-6.0-with-resteasy | Cette nomenclature BOM s'appuie sur le profil BOM complet de Java EE, ajoutant RESTEasy |
| jboss-javaee-6.0-with-security | Cette nomenclature BOM s'appuie sur le profil BOM complet de Java EE, ajoutant Picketlink. |
| jboss-javaee-6.0-with-tools | Cette nomenclature BOM s'appuie sur le profil BOM complet de Java EE, ajoutant Arquillian à l'ensemble. Elle procure également une version de JUnit et de TestNG conseillés pour l'utilisation avec Arquillian. |
| jboss-javaee-6.0-with-transactions | Cette nomenclature BOM inclut un gestionnaire de transactions de classe mondiale. Utiliser les API JBossTS pour pouvoir profiter de toutes ses fonctionnalités. |
6.4.0.GA de la nomemclature BOM jboss-javaee-6.0-with-hibernate.
JBoss Client BOMs
jboss-as-ejb-client-bom et jboss-as-jms-client-bom.
7.4.0.Final-redhat-x du client jboss-as-ejb-client-bom BOM.
7.4.0.Final-redhat-x du client BOM jboss-as-jms-client-bom.
2.4. Mise à niveau du référentiel Maven Copier lienLien copié sur presse-papiers!
2.4.1. Appliquer un correctif dans le répertoire Maven local Copier lienLien copié sur presse-papiers!
Un référentiel Maven stocke des bibliothèques Java, des plug-ins et autres objets nécessaires pour compiler et déployer des applications JBoss EAP. Le référentiel de JBoss EAP est disponible en ligne ou en fichier ZIP téléchargé. Si vous utilisez le référentiel hébergé publiquement, les mises à jour seront appliquées automatiquement. Toutefois, si vous téléchargez et installez le repository Maven localement, vous serez chargé d'appliquer les mises à jour vous-même. Chaque fois qu'un correctif sera disponible dans JBoss EAP, un correctif correspondant sera fourni pour le référentiel JBoss EAP Maven. Ce correctif est disponible sous la forme d'un fichier ZIP incrémentiel qui est décompressé dans le référentiel local existant. Le fichier ZIP contient des nouveaux fichiers JAR et POM. Il n'écrase pas les JAR existants, ni ne les supprime, donc il n'y a aucune exigence de restauration.
unzip.
Conditions préalables
- Accès valide et abonnement au portail clients de Red Hat.
- Le fichier Red Hat JBoss Enterprise Application Platform Maven Repository ZIP <VERSION>, téléchargé et installé localement.
Procédure 2.11. Mise à jour du référentiel Maven
- Ouvrir un navigateur et connectez-vous dans https://access.redhat.com.
- Sélectionnez du menu en haut de la page.
- Cherchez
Red Hat JBoss Enterprise Application Platformdans la liste et cliquez dessus. - Sélectionner la version de JBoss EAP qui convient à partir du menu déroulant Version qui apparaît sur l'écran, puis cliquer sur Correctifs.
- Chercher
Red Hat JBoss Enterprise Application Platform<VERSION>CPx Incremental Maven Repositorydans la liste et cliquer sur . - Vous êtes invité à sauvegarder le fichier ZIP dans un répertoire de votre choix. Sélectionner un répertoire et sauvegarder le fichier.
- Chercher le chemin d'accès vers le répertoire JBoss EAP dont il s'agit dans les commandes ci-dessous, sous EAP_MAVEN_REPOSITORY_PATH, correspondant à votre système d'exploitation. Pour obtenir plus d'informations sur la façon d'installer le référentiel Maven sur le système de fichiers local, voir Section 2.2.3, « Installer le référentiel Maven de JBoss EAP 6 localement ».
- Décompresser le fichier de correctifs Maven dans le répertoire d'installation de JBoss EAP <VERSION>.x.
- Dans Linux, ouvrir un terminal et saisir la commande suivante :
[standalone@localhost:9999 /] unzip -o jboss-eap-<VERSION>.x-incremental-maven-repository.zip -d EAP_MAVEN_REPOSITORY_PATH
[standalone@localhost:9999 /] unzip -o jboss-eap-<VERSION>.x-incremental-maven-repository.zip -d EAP_MAVEN_REPOSITORY_PATHCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Dans Windows, utiliser l'utilitaire pour extraire le fichier ZIP pour le mettre dans la racine du répertoire
EAP_MAVEN_REPOSITORY_PATH.
Le référentiel Maven installé localement est mis à jour au dernier correctif.
Chapitre 3. Chargement de classes modulaire et modules Copier lienLien copié sur presse-papiers!
3.1. Introduction Copier lienLien copié sur presse-papiers!
3.1.1. Chargement des classes de chargement et de modules Copier lienLien copié sur presse-papiers!
3.1.2. Chargement des classes Copier lienLien copié sur presse-papiers!
3.1.3. Modules Copier lienLien copié sur presse-papiers!
- Modules statiques
- Les modules statiques sont prédéfinis dans le répertoire
EAP_HOME/modules/du serveur d'applications. Chaque sous-répertoire représente un module et contient un sous-fichier de configurationmain/qui contient un fichier de configuration (module.xml) et tous les fichiers JAR requis. Le nom du module est défini dans le fichiermodule.xml. Toutes les API fournies par le serveur de l'application sont des modules statiques, y compris les API Java EE, et les autres API comme JBoss Logging.Exemple 3.1. Exemple de fichier module.xml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Le nom du module,com.mysql, doit correspondre à la structure du répertoire du module, à l'excepté du nom de sous-répertoiremain/.Les modules fournis dans les distributions JBoss EAP se trouvent dans un répertoiresystemse trouvant lui-même dans le répertoireJBOSS_HOME/modules. Cela les rend séparés de tout module fourni par une tierce partie.Tout produit mis en couche de Red Hat, se superposant sur JBoss EAP 6.1 ou version supérieure installera également leurs modules dans le répertoiresystem.La création de modules statiques personnalisés peut être utile si plusieurs applications sont déployées sur un même serveur utilisant les mêmes bibliothèques de tierce partie. Au lieu d'un regroupement de ces bibliothèques pour chaque application, un module contenant ces bibliothèques peut être créé et installé par l'administrateur JBoss. Les applications peuvent ensuite déclarer une dépendance explicite sur les modules statiques personnalisés.Les utilisateurs doivent s'assurer que les modules personnalisés soient installés dans le répertoireJBOSS_HOME/modules, en utilisant un répertoire par couche de modules. Cela garantit que les versions personnalisées de modules qui existent déjà dans le répertoiresystemsoient bien chargées à la place des versions fournies. Ainsi, les modules utilisateur auront la priorité sur les modules fournis par le système.Si vous utilisez la variable d'environnementJBOSS_MODULE_PATHpour changer les emplacements où JBoss EAP cherche les modules, le produit ira chercher dans une structure de sous-répertoiresystemdans un des emplacements spécifiés. Une structure de sous-répertoiresystemdoit exister quelquepart dans les emplacements spécifiés dansJBOSS_MODULEPATH. - Modules dynamiques
- Les modules dynamiques sont créés et chargés par le serveur d'applications pour chaque déploiement JAR ou WAR (ou sous-déploiement d'un EAR). Le nom d'un module dynamique est dérivé du nom de l'archive déployée. Comme les déploiements sont chargés sous forme de modules, ils peuvent configurer des dépendances et peuvent être utilisés comme dépendances par d'autres déploiements.
3.1.4. Les dépendances de modules Copier lienLien copié sur presse-papiers!
Exemple 3.2. Les dépendances de module
- Le Module A déclare une dépendance explicite sur le Module C, ou bien
- Le Module B exporte ses dépendances sur le Module C.
3.1.5. Chargement des classes dans les déploiements Copier lienLien copié sur presse-papiers!
- Déploiement WAR
- Un déploiement WAR est un simple module. Les classes du répertoire
WEB-INF/libsont considérées de la même manière que celles du répertoireWEB-INF/classes. Toutes les classes empaquetées dans le war seront téléchargées par le même chargeur de classes. - Déploiement EAR
- Les déploiements EAR sont faits de plus d'un module. La définition de ces modules suit ces règles :
- Le répertoire
lib/du EAR est un simple module nommé le module parent. - Chaque déploiement WAR du EAR est un simple module.
- Chaque déploiement EJB JAR du EAR est un simple module.
Les modules de sous-déploiement (les déploiements WAR et JAR dans EAR) ont une dépendance automatique sur le module parent. Cependant ils n'ont pas de dépendance automatique l'un sur l'autre. Ceci est appelé l'isolement du sous-déploiement et peut être désactivé par déploiement ou pour le serveur de toute l'application dans son ensemble.Les dépendances explicites entre les modules de sous-déploiement peuvent être ajoutées par les mêmes moyens, tout comme pour tout autre module.
3.1.6. Précédence pour le chargement des classes Copier lienLien copié sur presse-papiers!
- Dépendances implicites.Voici les dépendances qui sont ajoutées automatiquement par JBoss EAP 6, comme les API JAVA EE. Ces dépendances ont la plus haute précédence de chargeur de classe car ils contiennent des API et des fonctionnalités communes qui sont fournies par JBoss EAP 6.Voir Section 3.9.1, « Dépendances de modules implicites » pour obtenir des détails sur chaque dépendance implicite.
- Dépendances explicitesIl s'agit de dépendances qui sont ajoutées manuellement dans la configuration de l'application. Cela peut être fait à l'aide du fichier d'application
MANIFEST.MFou du nouveau fichier du descripteur de déploiement en option de JBossjboss-deployment-structure.xml.Voir Section 3.2, « Ajouter une dépendance de module explicite à un déploiement » pour apprendre comment ajouter des dépendances explicites. - Ressources locales.Fichiers de classe empaquetées à l'intérieur du déploiement lui-même, par ex. les répertoires
WEB-INF/classesouWEB-INF/libd'un fichier WAR. - Dépendances inter-déploiement.Ce sont des dépendances sur les autres déploiements d'un déploiement EAR. Cela peut inclure des classes du répertoire
libdu EAR ou des classes des autres jars EJB.
3.1.7. Nommage de modules dynamiques Copier lienLien copié sur presse-papiers!
- Les déploiements des fichiers WAR et JAR sont nommés selon le format suivant :
deployment.DEPLOYMENT_NAME
deployment.DEPLOYMENT_NAMECopy to Clipboard Copied! Toggle word wrap Toggle overflow Par exemple,inventory.waretstore.jarauront les mêmes noms de module quedeployment.inventory.waretdeployment.store.jarrespectivement. - Les sous-déploiements des archives Enterprise sont nommés selon le format suivant :
deployment.EAR_NAME.SUBDEPLOYMENT_NAME
deployment.EAR_NAME.SUBDEPLOYMENT_NAMECopy to Clipboard Copied! Toggle word wrap Toggle overflow Ainsi, le sous-déploiementreports.war, qui se trouve dans l'archive Enterpriseaccounts.ear, aura le nom de module dudeployment.accounts.ear.reports.war.
3.1.8. jboss-deployment-structure.xml Copier lienLien copié sur presse-papiers!
jboss-deployment-structure.xml est un descripteur de déploiement optionnel de JBoss EAP 6. Ce descripteur de déploiement fournit un contrôle de chargement des classes dans le déploiement.
EAP_HOME/docs/schema/jboss-deployment-structure-1_2.xsd
3.2. Ajouter une dépendance de module explicite à un déploiement Copier lienLien copié sur presse-papiers!
Conditions préalables
- Vous devez déjà avoir un projet de logiciel qui fonctionne, et auquel vous souhaitez ajouter une dépendance de module.
- Vous devez connaître le nom du module qui est ajouté comme dépendance. Voir Section 3.9.2, « Les modules inclus » pour obtenir la liste des modules statiques inclus dans JBoss EAP 6. Si le module correspond à un autre déploiement, voir Section 3.1.7, « Nommage de modules dynamiques » pour déterminer le nom du module.
- Par l'ajout d'entrées dans le fichier
MANIFEST.MFdu déploiement. - Par l'ajout d'entrées dans le descripteur de déploiement
jboss-deployment-structure.xml.
Procédure 3.1. Par l'ajout d'une configuration de dépendance à MANIFEST.MF
MANIFEST.MF. Voir Section 3.3, « Générer des entrées MANIFEST.MF en utilisant Maven ».
Ajouter le fichier
MANIFEST.MFSi le projet ne possède pas de fichierMANIFEST.MF, créer un fichier nomméMANIFEST.MF. Pour une application web (WAR), ajouter ce fichier au répertoireMETA-INF. Pour une archive EJB (JAR), l'ajouter au répertoireMETA-INF.Ajouter une entrée de dépendance
Ajouter une entrée de dépendance au fichierMANIFEST.MFavec une liste de noms de modules de dépendance séparés par des virgules.Dépendances : org.javassist, org.apache.velocity
Dépendances : org.javassist, org.apache.velocityCopy to Clipboard Copied! Toggle word wrap Toggle overflow Option : rendre une dépendance optionnelle
On peut rendre une dépendance optionnelle an ajoutantoptionalau nom du module de l'entrée de dépendance.Dépendances : org.javassist optional, org.apache.velocity
Dépendances : org.javassist optional, org.apache.velocityCopy to Clipboard Copied! Toggle word wrap Toggle overflow Option : export d'une dépendance
On peut exporter une dépendance en ajoutantexportau nom du module de l'entrée de dépendance.Dépendences : org.javassist, org.apache.velocity export
Dépendences : org.javassist, org.apache.velocity exportCopy to Clipboard Copied! Toggle word wrap Toggle overflow En option : dépendances utilisant des annotations
Cet indicateur est requis quand la dépendance de module contient des annotations qui doivent être traitées pendant l'analyse des annotations, comme lors de la déclaration des intercepteurs EJB. Si ce n'est pas fait, un intercepteur EJB déclaré dans un module ne peut pas être utilisé en déploiement. Il y a d'autres situations impliquant des analyses d'annotation quand c'est nécessaire.Utiliser cet indicateur exige que le nodule comprenne un index Jandex. Les directives de création et d'utilisation d'un index Jandex sont incluses à la fin de cette section.
Procédure 3.2. Ajouter une configuration de dépendance à jboss-deployment-structure.xml
Ajouter
jboss-deployment-structure.xmlSi l'application n'a pas de fichierjboss-deployment-structure.xml, créer un nouveau fichier nomméjboss-deployment-structure.xmlet l'ajouter au projet. Ce fichier est un fichier XML ayant l'élément racine de<jboss-deployment-structure>.<jboss-deployment-structure> </jboss-deployment-structure>
<jboss-deployment-structure> </jboss-deployment-structure>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Pour une application web (WAR), ajouter ce fichier au répertoireWEB-INF. Pour une archive EJB (JAR), l'ajouter au répertoireMETA-INF.Ajouter une section de dépendances
Créer un élément<deployment>à l'intérieur de la racine du document et un élément<dependencies>également.Ajouter les éléments du module
Dans le nœud de dépendances, ajouter un élément de module pour chaque dépendance du module. Définir l'attributnameau nom du module.<module name="org.javassist" />
<module name="org.javassist" />Copy to Clipboard Copied! Toggle word wrap Toggle overflow Option : rendre une dépendance optionnelle
On peut rendre une dépendance optionnelle en ajoutant l'attributoptionalà l'entrée du module, avec la valeurtrue. La valeur par défaut de cet attribut estfalse.<module name="org.javassist" optional="true" />
<module name="org.javassist" optional="true" />Copy to Clipboard Copied! Toggle word wrap Toggle overflow Option : export d'une dépendance
On peut exporter une dépendance en ajoutant l'attributoptionalà l'entrée du module, avec la valeurtrue. La valeur par défaut de cet attribut estfalse.<module name="org.javassist" export="true" />
<module name="org.javassist" export="true" />Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Exemple 3.3. jboss-deployment-structure.xml avec deux dépendances
L'indicateur d'annotations exige que le module contienne un index Jandex. Vous pouvez créer un nouvel "index JAR" à ajouter au module. Utiliser le JAR Jandex pour créer l'index, puis l'insérer dans un nouveau fichier JAR :
Procédure 3.3.
Créer l'index
java -jar $JBOSS_HOME/modules/org/jboss/jandex/main/jandex-1.0.3.Final-redhat-1.jar $JAR_FILE
java -jar $JBOSS_HOME/modules/org/jboss/jandex/main/jandex-1.0.3.Final-redhat-1.jar $JAR_FILECopy to Clipboard Copied! Toggle word wrap Toggle overflow Créer un espace de travail temporaire
mkdir /tmp/META-INF
mkdir /tmp/META-INFCopy to Clipboard Copied! Toggle word wrap Toggle overflow Déplacer le fichier index sur le répertoire de travail
mv $JAR_FILE.ifx /tmp/META-INF/jandex.idx
mv $JAR_FILE.ifx /tmp/META-INF/jandex.idxCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Option 1: Inclure l'index dans un nouveau fichier JAR
jar cf index.jar -C /tmp META-INF/jandex.idx
jar cf index.jar -C /tmp META-INF/jandex.idxCopy to Clipboard Copied! Toggle word wrap Toggle overflow Puis, metttez le JAR dans le répertoire de modules et modifiermodule.xmlpour y ajouter les roots de ressources. - Option 2: Ajouter l'index à une JAR existante
java -jar $JBOSS_HOME/modules/org/jboss/jandex/main/jandex-1.0.3.Final-redhat-1.jar -m $JAR_FILE
java -jar $JBOSS_HOME/modules/org/jboss/jandex/main/jandex-1.0.3.Final-redhat-1.jar -m $JAR_FILECopy to Clipboard Copied! Toggle word wrap Toggle overflow
Indiquer à l'importation d'index d'utiliser l'index d'annotations
Indiquer à l'importation d'index d'utiliser l'index d'annotations, pour que le balayage des annotations permettent de les trouver.Choisissez une des méthodes ci-dessous, selon votre situation :- Si vous ajoutez une dépendance de module par MANIFEST.MF, ajouter
annotationsà la suite du nom du module.Ainsi, changer :Dependencies: test.module, other.module
Dependencies: test.module, other.moduleCopy to Clipboard Copied! Toggle word wrap Toggle overflow enDependencies: test.module annotations, other.module
Dependencies: test.module annotations, other.moduleCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Si vous ajoutez une dépendance de module en utilisant
jboss-deployment-structure.xmlajouterannotations="true"à la dépendance du module.
3.3. Générer des entrées MANIFEST.MF en utilisant Maven Copier lienLien copié sur presse-papiers!
MANIFEST.MF avec une entrée Dependencies. Ce procédé ne génère pas automatiquement la liste de dépendances, il crée seulement le fichier MANIFEST.MF avec les informations spécifiées dans le fichier pom.xml.
Conditions préalables
- Vous devez déjà posséder un projet Maven en cours.
- Le projet Maven doit utiliser l'un des plug-ins JAR, EJB, ou WAR (
maven-jar-plugin,maven-ejb-plugin,maven-war-plugin). - Vous devez connaître le nom des dépendances de module du projet. Voir Section 3.9.2, « Les modules inclus » pour obtenir la liste des modules statiques inclus dans JBoss EAP 6. Si le module est dans un autre déploiement, voir Section 3.1.7, « Nommage de modules dynamiques » pour déterminer le nom du module.
Procédure 3.4. Générer un fichier MANIFEST.MF contenant des dépendances de module.
Ajouter une configuration
Ajouter la configuration suivante à la configuration du plug-in de l'empaquetage dans le fichierpom.xmldu projet.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Liste de dépendances
Ajouter la liste des dépendances de module dans l'élement <Dependencies>. Utiliser le même format utilisé lors de l'ajout des dépendances dans leMANIFEST.MF. Veuillez consulter Section 3.2, « Ajouter une dépendance de module explicite à un déploiement » pour plus d'informations sur ce format.<Dependencies>org.javassist, org.apache.velocity</Dependencies>
<Dependencies>org.javassist, org.apache.velocity</Dependencies>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Build de projet
Procédez au build de projet en utilisant l'objectif d'assemblage de Maven.mvn assembly:assembly
[Localhost ]$ mvn assembly:assemblyCopy to Clipboard Copied! Toggle word wrap Toggle overflow
MANIFEST.MF avec les dépendances de module spécifiées.
Exemple 3.4. Dépendances de module configurées dans pom.xml
3.4. Empêcher qu'un module soit chargé implicitement Copier lienLien copié sur presse-papiers!
Conditions préalables
- Vous devez déjà avoir un projet informatique qui fonctionne et dont vous souhaitez exclure une dépendance.
- Vous devez connaître le nom du module à exclure. Voir Section 3.9.1, « Dépendances de modules implicites » pour obtenir une liste des dépendances implicites et de leurs conditions.
Procédure 3.5. Ajouter une configuration d'exclusion de dépendances de jboss-deployment-structure.xml
- Si l'application n'a pas de fichier
jboss-deployment-structure.xml, créer un nouveau fichier intituléjboss-deployment-structure.xmlet ajoutez-le au projet. Ce fichier est un fichier XML ayant comme élément root<jboss-deployment-structure>.<jboss-deployment-structure> </jboss-deployment-structure>
<jboss-deployment-structure> </jboss-deployment-structure>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Pour une application web (WAR), ajouter ce fichier au répertoireWEB-INF. Pour une archive EJB (JAR), l'ajouter au répertoireMETA-INF. - Créer un élément
<deployment>dans la racine de l'élément et un<exclusions>à l'intérieur.<deployment> <exclusions> </exclusions> </deployment>
<deployment> <exclusions> </exclusions> </deployment>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Dans l'élément d'exclusion, ajouter un élément
<module>pour chaque module à exclure. Définir l'attributnameau nom du module.<module name="org.javassist" />
<module name="org.javassist" />Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Exemple 3.5. Exclusion de deux modules
3.5. Exclure un sous-système d'un déploiement Copier lienLien copié sur presse-papiers!
Ce sujet traite des étapes nécessaires pour exclure un sous-système d'un déploiement. Pour ce faire, il convient de modifier le fichier de configuration jboss-deployment-structure.xml. Le fait d'exclure un sous-système crée le même effet que de le retirer, sauf qu'il ne s'applique qu'à un seul déploiement.
Procédure 3.6. Exclure un sous-système
- Ouvrir le fichier
jboss-deployment-structure.xmldans un éditeur de texte. - Ajouter le XML suivant dans les balises de <deployment> :
<exclude-subsystems> <subsystem name="SUBSYSTEM_NAME" /> </exclude-subsystems>
<exclude-subsystems> <subsystem name="SUBSYSTEM_NAME" /> </exclude-subsystems>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Enregistrer le fichier
jboss-deployment-structure.xml
Le sous-système a bien été exclus. Les processeurs d'unité de déploiement du sous-système n'exécuteront plus sur le déploiement.
Exemple 3.6. Exemple d'un fichier jboss-deployment-structure.xml.
3.6. Utiliser le chargeur de classes par programmation dans un développement Copier lienLien copié sur presse-papiers!
3.6.1. Chargement des classes et des ressources par programmation dans le déploiement. Copier lienLien copié sur presse-papiers!
- Charger une classe en utilisant la méthode Class.forName()
- Vous pouvez utiliser la méthode
Class.forName()pour charger ou initialiser les classes par programmation. Cette méthode comprend deux signatures.La signature à trois arguments est la méthode recommandée pour charger une classe par programmation. Cette signature vous permet de contrôler si vous souhaitez que la classe cible soit initialisée pendant le chargement. Il est également plus efficace d'obtenir et de fournir le chargeur de classe parce que la JVM n'a pas besoin d'examiner la pile des appels pour déterminer quel chargeur de classe utiliser. En supposant que la classe contenant le code se nomme- Class.forName(String className)
- Cette signature ne prend en compte qu'un seul paramètre, le nom de la classe que vous devez charger. Avec cette méthode de signature, la classe est chargée par le chargeur de classes et initialise la classe nouvellement chargée par défaut.
- Class.forName(String className, boolean initialize, ClassLoader loader)
- Cette signature s'attend à recevoir trois paramètres : le nom de la classe, une valeur booléenne qui indique si on doit initialiser la classe, et le ClassLoader qui doit charger la classe.
CurrentClass, vous pourrez obtenir le chargeur de classes de la classe par la méthodeCurrentClass.class.getClassLoader().L'exemple suivant donne un exemple de chargeur de classes qui puisse charger et initialiser la classeTargetClass:Exemple 3.7. Fournir un chargeur de classes pour télécharger et initialiser les TargetClass.
Class<?> targetClass = Class.forName("com.myorg.util.TargetClass", true, CurrentClass.class.getClassLoader());Class<?> targetClass = Class.forName("com.myorg.util.TargetClass", true, CurrentClass.class.getClassLoader());Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Chercher toutes les ressources avec un Prénom
- Si vous connaissez le nom ou le chemin de la ressource, la meilleure façon de la charger directement serait d'utiliser la classe JDK ou l'API Classloader.
- Charger une seule ressource
- Pour charger une seule ressource qui se trouve dans le même répertoire que votre classe ou dans une autre classe de votre déploiement, vous pouvez utiliser la méthode
Class.getResourceAsStream().Exemple 3.8. Charger une seule ressource dans votre déploiement.
InputStream inputStream = CurrentClass.class.getResourceAsStream("targetResourceName");InputStream inputStream = CurrentClass.class.getResourceAsStream("targetResourceName");Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Charger toutes les instances en une ressource unique
- Pour charger toutes les instances d'une même ressource qui sont visibles par le chargeur de classe de votre déploiement, utilisez la méthode
Class.getClassLoader retourne ().getResources(String resourceName), oùresourceNameest le chemin d'accès qualifié complet de la ressource. Cette méthode retourne une énumération de tous les objetsURLpour les ressources accessibles par le chargeur de classe du prénom donné. Vous pouvez ensuite parcourir le tableau des URL pour ouvrir chaque flux à l'aide de la méthodeopenStream().Exemple 3.9. Charger toutes les instances d'une ressource et itérer le résultat.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Note
Comme les instances URL sont chargées à partir du stockage local, il n'est pas utile d'utiliseropenConnection()ou des méthodes semblables. Les flux sont plus faciles à utiliser et minimisent la complexité du code.
- Charger un fichier de classe à partir d'un chargeur de classes
- Si une classe a déjà été chargée, vous pouvez charger le fichier de classe qui correspond à cette classe en utilisant la syntaxe suivante :Si la classe n'a pas encore été chargée, vous devrez utiliser le chargeur de classes et en interpréter le chemin d'accès :
Exemple 3.10. Charger un fichier de classe déjà chargée.
InputStream inputStream = CurrentClass.class.getResourceAsStream(TargetClass.class.getSimpleName() + ".class");
InputStream inputStream = CurrentClass.class.getResourceAsStream(TargetClass.class.getSimpleName() + ".class");Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple 3.11. Charger un fichier de classe d'une classe qui n'a pas été chargée.
String className = "com.myorg.util.TargetClass" InputStream inputStream = CurrentClass.class.getClassLoader().getResourceAsStream(className.replace('.', '/') + ".class");String className = "com.myorg.util.TargetClass" InputStream inputStream = CurrentClass.class.getClassLoader().getResourceAsStream(className.replace('.', '/') + ".class");Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.6.2. Itérer les ressources par programmation dans un déploiement. Copier lienLien copié sur presse-papiers!
MANIFEST.MF :
Dépendences: org.jboss.modules
Dépendences: org.jboss.modules
- Lister les ressources du déploiement et de toutes les importations.
- Il y a des moments où il n'est pas possible de rechercher des ressources par le chemin exact. Par exemple, le chemin d'accès exact n'est peut être pas connu ou vous devrez peut-être examiner plus d'un fichier dans un chemin d'accès donné. Dans ce cas, la bibliothèque de modules de JBoss fournit plusieurs API pour une itération de toutes les ressources de déploiement. Vous pouvez parcourir les ressources dans un déploiement en utilisant une des deux méthodes.
- Itérer toutes les ressources qui se trouvent dans un seul module
- La méthode
ModuleClassLoader.iterateResources()itère toutes les ressources au sein de ce chargeur de classes de module. Cette méthode accepte deux arguments : le nom du répertoire de départ à rechercher et une valeur booléenne qui spécifie s'il doit agir récursivement dans les sous-répertoires.L'exemple suivant montre comment on obtient le ModuleClassLoader ou l'itérateur pour les ressources qui se trouvent dans le répertoirebin/, récursivement dans les sous-répertoires.L'itérateur résultant peut être utilisé pour examiner chaque ressource correspondante et pour chercher son nom et sa taille (si disponible), pour ouvrir une transmission à lire, ou pour obtenir l'URL d'une ressource.Exemple 3.12. Chercher les ressources du répertoire "bin" récursivement dans les sous-répertoires.
ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Iterator<Resource> mclResources = moduleClassLoader.iterateResources("bin",true);ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Iterator<Resource> mclResources = moduleClassLoader.iterateResources("bin",true);Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Itérer toutes les ressources qui se trouvent dans un seul module et dans les ressources importées
- La méthode
Module.iterateResources()itère toutes les ressources au sein de ce chargeur de classes de module, y compris les ressources qui sont importées dans le module. Cette méthode renvoie un ensemble beaucoup plus vaste que la méthode précédente. Cette méthode requiert un argument: un filtre qui rétrécit le résultat à un modèle spécifique. Alternativement, les PathFilters.acceptAll() peuvent être fournis pour retourner l'ensemble.Exemple 3.13. Chercher toutes les ressources de ce module, y compris les importations.
ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Module module = moduleClassLoader.getModule(); Iterator<Resource> moduleResources = module.iterateResources(PathFilters.acceptAll());
ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Module module = moduleClassLoader.getModule(); Iterator<Resource> moduleResources = module.iterateResources(PathFilters.acceptAll());Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- Chercher toutes les ressources qui correspondent à un modèle particulier
- Si vous avez besoin de trouver des ressources spécifiques dans votre déploiement ou dans son importation complète, vous devrez filtrer l'itération de la ressource. Les API de filtrage de JBoss Modules peuvent vous donner plusieurs outils pour y parvenir.
- Examiner toutes les dépendances
- Si vous devez examiner l'ensemble des dépendances, vous pouvez utiliser le paramètre
PathFilterde la méthodeModule.iterateResources()pour vérifier le nom de chaque ressource et trouver une correspondance. - Examiner les dépendances de déploiement
- Si vous devez chercher uniquement dans le déploiement, utilisez la méthode
ModuleClassLoader.iterateResources(). Toutefois, vous devez utiliser des méthodes supplémentaires pour filtrer l'itérateur qui en résulte. La méthodePathFilters.filtered()peut fournir une vue filtrée d'un itérateur de ressources dans ce cas. La classePathFilterscomprend plusieurs méthodes statiques pour créer et composer des filtres qui remplissent des fonctions diverses, y compris la recherche de chemins dépendants ou des correspondances exactes, ou encore correspondant à un motif "glob" Ant-style.
- Exemples de codes supplémentaires pour filtrer les ressources
- Les exemples suivants démontrent comment filtrer les ressources sur la base de critères différents.
Exemple 3.14. Trouver tous les noms qui comprennent "messages.properties" dans votre déploiement.
ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Iterator<Resource> mclResources = PathFilters.filtered(PathFilters.match("**/messages.properties"), moduleClassLoader.iterateResources("", true));ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Iterator<Resource> mclResources = PathFilters.filtered(PathFilters.match("**/messages.properties"), moduleClassLoader.iterateResources("", true));Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple 3.15. Trouver tous les noms qui comprennent "messages.properties" dans votre déploiement et dans vos importations.
ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Module module = moduleClassLoader.getModule(); Iterator<Resource> moduleResources = module.iterateResources(PathFilters.match("**/message.properties));ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Module module = moduleClassLoader.getModule(); Iterator<Resource> moduleResources = module.iterateResources(PathFilters.match("**/message.properties));Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple 3.16. Trouver tous les fichiers qui se trouvent dans tout répertoire nommé "my-resources" de votre déploiement.
ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Iterator<Resource> mclResources = PathFilters.filtered(PathFilters.match("**/my-resources/**"), moduleClassLoader.iterateResources("", true));ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Iterator<Resource> mclResources = PathFilters.filtered(PathFilters.match("**/my-resources/**"), moduleClassLoader.iterateResources("", true));Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple 3.17. Trouver tous les fichiers nommés "messages.properties" dans votre déploiement et dans vos importations.
ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Module module = moduleClassLoader.getModule(); Iterator<Resource> moduleResources = module.iterateResources(PathFilters.any(PathFilters.match("**/messages"), PathFilters.match("**/errors"));ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Module module = moduleClassLoader.getModule(); Iterator<Resource> moduleResources = module.iterateResources(PathFilters.any(PathFilters.match("**/messages"), PathFilters.match("**/errors"));Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple 3.18. Trouver tous les fichiers qui se trouvent dans un package spécifique de votre déploiement.
ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Iterator<Resource> mclResources = moduleClassLoader.iterateResources("path/form/of/packagename", false);ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Iterator<Resource> mclResources = moduleClassLoader.iterateResources("path/form/of/packagename", false);Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.7. Chargement de classe et sous-déploiements Copier lienLien copié sur presse-papiers!
3.7.1. Chargement de classes et de modules dans les EAR (Archives Enterprise) Copier lienLien copié sur presse-papiers!
- Chaque sous-déploiement WAR ou EJB JAR est un module.
- Le contenu du répertoire
lib/de la racine de l'archive EAR est un module. On l'appelle un module parent.
- Les sous-déploiements WAR possédent des dépendances implicites sur le module parent et sur tout sous-déploiement JAR EJB.
- Les sous-déploiements EJB JAR possédent des dépendances implicites sur le module parent et sur tout sous-déploiement JAR EJB.
Important
Class-Path dans le fichier MANIFEST.MF de chaque sous-déploiement.
3.7.2. Isolement du chargeur de classes d'un sous-déploiement Copier lienLien copié sur presse-papiers!
3.7.3. Désactiver l'isolement du chargeur de classes d'un sous-déploiement dans une EAR Copier lienLien copié sur presse-papiers!
Important
Ajouter le fichier du descripteur de déploiement
Ajouter le fichier de descripteur de déploiementjboss-deployment-structure.xmlau répertoireMETA-INFde l'EAR s'il n'existe pas déjà et ajouter le contenu suivant :<jboss-deployment-structure> </jboss-deployment-structure>
<jboss-deployment-structure> </jboss-deployment-structure>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Ajouter l'élément
<ear-subdeployments-isolated>Ajouter l'élément<ear-subdeployments-isolated>au fichierjboss-deployment-structure.xmls'il n'existe pas déjà dans le contenu defalse.<ear-subdeployments-isolated>false</ear-subdeployments-isolated>
<ear-subdeployments-isolated>false</ear-subdeployments-isolated>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
L'isolement de chargeur de classe de sous-déploiement sera maintenant désactivé pour le déploiement de cet EAR. Cela signifie que les sous-déploiements de l'EAR auront des dépendances automatiques sur chacun des sous-déploiements non-WAR.
3.8. Déployer des TLD (Tag Library Descriptors) dans un module personnalisé Copier lienLien copié sur presse-papiers!
Si vous avez plusieurs applications qui utilisent des TLD (Tag Library Descriptors), il peut être utile de séparer les TLD des applications pour qu'ils soient situés à un seul et unique emplacement. Cela permet des additions et mises à jour de TLD facilitées sans devoir nécessairement mettre à jour chaque application qui les utilise.
- Au moins un JAR contenant des TLD. Assurez-vous que les TLD sont empaquetés dans
META-INF.
Procédure 3.7. Déployer des TLD dans un module personnalisé
- À l'aide du Management CLI, connectez-vous à votre instance JBoss EAP 6 et exécutez la commande suivante pour créer le module personnalisé contenant le JAR TLD :
module add --name=MyTagLibs --resources=/path/to/TLDarchive.jar
module add --name=MyTagLibs --resources=/path/to/TLDarchive.jarCopy to Clipboard Copied! Toggle word wrap Toggle overflow Si les TLD sont empaquetés avec des classes qui nécessitent des dépendances, utilisez l'option--dependencies=DEPENDENCYpour assurer que vous spécifiez ces dépendances lors de la création d'un module personnalisé.Lors de la création du module, vous pouvez spécifier de multiples ressources JAR en les séparant par:. Par exemple,--resources=/path/to/one.jar:/path/to/two.jar - Dans vos applications, déclarez une dépendance sur le nouveau module personnalisé MyTagLibs en utilisant l'une des méthodes décrites dans Section 3.2, « Ajouter une dépendance de module explicite à un déploiement ».
Important
Assurez-vous également d'importerMETA-INFlorsque vous déclarez la dépendance. Par exemple, pourMANIFEST.MF:Ou, pourDependencies: com.MyTagLibs meta-inf
Dependencies: com.MyTagLibs meta-infCopy to Clipboard Copied! Toggle word wrap Toggle overflow jboss-deployment-structure.xml, utilisez l'attributmeta-inf.
Dans vos applications, vous pouvez utiliser des TLD contenues dans le nouveau module personnalisé.
3.9. Référence Copier lienLien copié sur presse-papiers!
3.9.1. Dépendances de modules implicites Copier lienLien copié sur presse-papiers!
| Sous-système responsable de l'ajout de la dépendance | Dépendances qui sont toujours ajoutées | Dépendances qui sont ajoutées conditionnellement | Conditions qui déclenchent l'ajout de dépendances |
|---|---|---|---|
| Serveur principal |
| | |
| EE subsystem |
| | |
| EJB 3 subsystem | |
|
La présence d'un ficher
ejb-jar.xml à des emplacements valides dans le déploiement, tel que mentionné dans les spécifications Java EE 6.
La présence d'EJB basés-annotations, comme :
@Stateless, @Stateful, @MessageDriven
|
| Sous-système JAX-RS (RESTEasy) |
|
| La présence d'annotations JAX-RS dans le déploiement. |
| Sous-système JCA |
|
| Le déploiement d'une archive d'adaptateur de ressources (RAR). |
| Sous-système JPA (Hibernate) |
|
|
La présence de l'annotation
@PersistenceUnit ou @PersistenceContext, <persistence-unit-ref> ou encore d'un élément <persistence-context-ref> dans un descripteur de déploiement.
JBoss EAP 6 mappe les noms du fournisseur de persistance aux noms du module. Si vous nommez un fournisseur particulier dans le fichier
persistence.xml, une dépendance sera ajoutée au module qui convient. Si ce comportement ne convient pas, vous pourrez l'exclure par l'intermdiaire d'un fichier jboss-deployment-structure.xml.
|
| Sous-système de journalisation |
| |
Ces dépendances sont toujours ajoutées à moins que l'attribut
add-logging-api-dependencies soit défini à false.
|
| Sous-système SAR | |
| Le déploiement d'une archive SAR. |
| Sous-système de sécurité |
| | |
| Sous-système Web | |
| Le déploiement d'une archive WAR. JavaServer Faces (JSF) est ajouté uniquement si utilisé. |
| Sous-système de Services Web |
| | |
| Sous-système Weld (CDI) | |
| La présence d'un fichier beans.xml dans le déploiement. |
3.9.2. Les modules inclus Copier lienLien copié sur presse-papiers!
3.9.3. Référence de descripteur de déploiement de structure de déploiement de JBoss Copier lienLien copié sur presse-papiers!
- Définition des dépendances de modules explicites.
- Empêcher les dépendances implicites spécifiques de charger.
- Définir des modules supplémentaires à partir des ressources de ce déploiement.
- Modifier le comportement de l'isolation du sous-déploiement dans ce déploiement d'EAR.
- Ajouter des racines de ressources supplémentaires à une EAR.
Chapitre 4. Valves Copier lienLien copié sur presse-papiers!
4.1. Valves Copier lienLien copié sur presse-papiers!
- Les valves globales sont configurées au niveau serveur et s'appliquent à toutes les applications déployées dans le serveur. Les instructions sur la façon de configurer les valves globales se trouvent dans le guide Administration and Configuration Guide de JBoss EAP.
- Les valves configurées au niveau de l'application sont empaquetées dans le déploiement de l'application et n'affectent que l'application en question. Des instructions sur la façon de configurer des valves au niveau de l'application se trouvent dans le guide Development Guide de JBoss EAP.
4.2. Valves globales Copier lienLien copié sur presse-papiers!
4.3. Les valves d'authentification Copier lienLien copié sur presse-papiers!
org.apache.catalina.authenticator.AuthenticatorBase et elle remplace la méthode authenticate(Request request, Response response, LoginConfig config).
4.4. Configurer une application web pour utiliser une valve. Copier lienLien copié sur presse-papiers!
jboss-web.xml.
Important
Conditions préalables
- La valve doit être créée et incluse dans le chemin de classe de l'application. Pour ce faire, il convient de l'inclure dans le fichier WAR de l'application ou dans tout autre module ajouté comme dépendance. Les exemples de tels modules comprennent un module statique installé sur le serveur ou un fichier JAR dans le répertoire
lib/d'une archive EAR si le WAR est déployé dans une archive EAR. - L'application doit inclure un descripteur de déploiement de
jboss-web.xml.
Procédure 4.1. Configurer une application pour une valve locale.
Configuration d'une valve
Créer un élémentvalvecontenant l'élément enfantclass-nameau fichierjboss-web.xmlde l'application. Leclass-nameest le nom de la classe de valve.<valve> <class-name>VALVE_CLASS_NAME</class-name> </valve><valve> <class-name>VALVE_CLASS_NAME</class-name> </valve>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple 4.1. Exemple d'élément de valve configuré dans le fichier jboss-web.xml
<valve> <class-name>org.jboss.security.negotiation.NegotiationAuthenticator</class-name> </valve><valve> <class-name>org.jboss.security.negotiation.NegotiationAuthenticator</class-name> </valve>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Configurer une valve personnalisée
Si la valve possède des paramètres configurables, ajouter un élément enfantparamà l'élémentvalvepour chaque paramètre, en spécifiant leur nom et leur valeurparam-nameetparam-value.Exemple 4.2. Exemple d'élément de valve personnalisé configuré dans le fichier jboss-web.xml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Exemple 4.3. Configuration valve jboss-web.xml
4.5. Configurer une application web pour qu'elle utilise une valve d'authentification Copier lienLien copié sur presse-papiers!
web.xml de l'application. Dans le cas le plus simple, la configuration web.xml revient à utiliser une authentification BASIC sauf que l'élément enfant auth-method de login-config est défini sous le nom de la valve qui effectue la configuration.
Conditions préalables
- La valve d'authentification devrait déjà être créée.
- Si la valve d'authentification est une valve globale, cette dernière devrait déjà être installée et configurée, et il convient de connaître le nom sous lequel elle a été configurée.
- Informez-vous du nom de domaine de la zone de sécurité que l'application utilise.
Procédure 4.2. Configurer une application pour utiliser une valve d'authentification
Configurer la valve
L'utilisation d'une valve locale nécessite une configuration dans le descripteur de déploiementjboss-web.xmldes applications. Voir Section 4.4, « Configurer une application web pour utiliser une valve. ».Cela n'est pas nécessaire pour l'utilisation d'une valve globale.Ajouter une configuration de sécurité à web.xml.
Ajouter la configuration de sécurité au fichier web.xml pour votre application en utilisant les éléments standards tels que la contrainte de sécurité, la configuration de l'identifiant et le rôle de la sécurité. Dans l'élément de configuration de l'identifiant, définir la valeur de la méthode d'identification en tant que nom de la valve d'identification. L'élément de nom de la zone doit également être défini en tant que nom de la zone de sécurité de JBoss utilisée par l'application.<login-config> <auth-method>VALVE_NAME</auth-method> <realm-name>REALM_NAME</realm-name> </login-config>
<login-config> <auth-method>VALVE_NAME</auth-method> <realm-name>REALM_NAME</realm-name> </login-config>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.6. Créer une valve personnalisée Copier lienLien copié sur presse-papiers!
Procédure 4.3. Créer une valve personnalisée
Créer la classe Valve
Créer une sous-classe deorg.apache.catalina.valves.ValveBase.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Mettre en place la méthode d'invocation
La méthodeinvoke()est utilisée lorsque la valve est exécutée dans la pipeline. Les objets de requête et de réponse sont considérés comme des paramètres. Effectuer tout procédé et modification de requête et réponse ici.public void invoke(Request request, Response response) { }public void invoke(Request request, Response response) { }Copy to Clipboard Copied! Toggle word wrap Toggle overflow Invoquer la prochaine étape de pipeline
La dernière étape que la méthode d'invocation doit effectuer est d'invoquer l'étape suivante de la pipeline et de transmettre les objets de requête et de réponse modifiés, en utilisant la méthodegetNext().invoke().getNext().invoke(request, response);
getNext().invoke(request, response);Copy to Clipboard Copied! Toggle word wrap Toggle overflow Option : indiquer les paramètres
Si la valve doit être configurable, activer cette option en ajoutant un paramètre. Pour ce faire, il convient d'ajouter une variable d'instance et une méthode setter pour chaque paramètre.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Exemple 4.4. Échantillon de valve personnalisée
Chapitre 5. La journalisation pour les développeurs Copier lienLien copié sur presse-papiers!
5.1. Introduction Copier lienLien copié sur presse-papiers!
5.1.1. Journalisation Copier lienLien copié sur presse-papiers!
5.1.2. Frameworks de journalisations d'applications pris en charge par JBoss LogManager Copier lienLien copié sur presse-papiers!
- JBoss Logging - inclus avec JBoss EAP 6
- Apache Commons Logging - http://commons.apache.org/logging/
- Simple Logging Facade Java (SLF4J) - http://www.slf4j.org/
- Apache log4j - http://logging.apache.org/log4j/1.2/
- Java SE Logging (java.util.logging) - http://download.oracle.com/javase/6/docs/api/java/util/logging/package-summary.html
5.1.3. Niveaux de journalisation Copier lienLien copié sur presse-papiers!
TRACE, DEBOG, INFO, ATTENTION, ERREUR et FATAL.
ATTENTION enregistrera uniquement les messages des niveaux ATTENTION, ERREUR et FATAL.
5.1.4. Niveaux de journalisation pris en charge Copier lienLien copié sur presse-papiers!
| Niveau de journalisation | Valeur | Description |
|---|---|---|
| FINESSE MAX | 300 |
-
|
| PLUS FIN | 400 |
-
|
| TRACE | 400 |
Utilisé pour des messages qui fournissent des informations détaillées sur l'état d'exécution d'une application. Les messages de journalisation
TRACE sont habituellement capturés uniquement lors du débogage d'une application.
|
| DEBOG | 500 |
Utilisé pour des messages qui indiquent des demandes individuelles de progrès ou des activités d'une application. Les messages de journalisation
DEBUG ne sont habituellement capturés que lors du débogage d'une application.
|
| FINESSE | 500 |
-
|
| CONFIG | 700 |
-
|
| INFO | 800 |
Utilisé pour des messages qui indiquent la progression globale de l'application. Souvent utilisé pour le démarrage de l'application, la fermeture et autres événements majeurs de cycle de vie.
|
| AVERTISSEMENT | 900 |
Utilisé pour indiquer une situation qui n'est pas en erreur, mais pas idéal. Peut indiquer des circonstances qui peuvent entraîner des erreurs dans le futur.
|
| ATTENTION | 900 |
-
|
| ERREUR | 1000 |
Utiliser pour indiquer une erreur qui s'est produite et qui puisse empêcher l'activité actuelle ou la demande de se remplir, mais qui n'empêchera pas l'application d'exécuter.
|
| SÉVÈRE | 1000 |
-
|
| FATALE | 1100 |
Utiliser pour indiquer les événements qui pourraient entraîner des défaillances de services critiques ou la fermeture de l'application, ou qui pourraient entraîner la fermeture de la plateforme JBoss EAP 6.
|
5.1.5. Emplacements de fichiers de journalisation par défaut Copier lienLien copié sur presse-papiers!
| Fichier journal | Description |
|---|---|
EAP_HOME/standalone/log/server.log |
Journal du serveur. Contient les messages de journalisation de serveur, dont les messages de démarrage de serveur.
|
EAP_HOME/standalone/log/gc.log |
Journalisation de Garbage collection. Contient des informations sur tous les nettoyages de mémoire.
|
| Fichier journal | Description |
|---|---|
EAP_HOME/domain/log/host-controller.log |
Journal d'amorçage du contrôleur hôte. Contient les messages de journalisation liés au démarrage du contrôleur hôte.
|
EAP_HOME/domain/log/process-controller.log |
Journal d'amorçage du contrôleur de processus. Contient les messages de journalisation liés au démarrage du contrôleur de processus.
|
EAP_HOME/domain/servers/SERVERNAME/log/server.log |
Le journal du serveur pour le serveur nommé. Contient les messages de journalisation de ce serveur, dont les messages de démarrage de serveur.
|
5.2. Journalisation dans le JBoss Logging Framework Copier lienLien copié sur presse-papiers!
5.2.1. JBoss Logging Copier lienLien copié sur presse-papiers!
5.2.2. Fonctionnalités de JBoss Logging Copier lienLien copié sur presse-papiers!
- Fournit un enregistreur d'événements de saisie ("typed") facile d'utilisation.
- Support total pour l'internationalisation et la localisation. Les traducteurs travaillent sur des lots de messages dans des fichiers de propriétés, tandis que les développeurs peuvent travailler sur des interfaces et des annotations.
- Outils « buid-time » pour générer les enregistreurs d'événements en saisie pour la production, et la génération d'enregistreurs d'événements pour le développement, en cours d'exécution.
5.2.3. Ajouter une journalisation à une application par JBoss Logging Copier lienLien copié sur presse-papiers!
org.jboss.logging.Logger) et utiliser la méthode appropriée de cet objet. Cette tâche décrit les étapes nécessaires pour ajouter un support pour ceci à votre application.
Conditions préalables
- Si vous utilisez Maven en tant que système de build, il convient que le projet soit déjà configuré pour inclure le référentiel JBoss Maven. Voir Section 2.3.2, « Configurer le référentiel JBoss EAP 6 Platform Maven Repository par les paramètres de configuration de Maven »
- Les fichiers JAR de JBoss Logging doivent se trouver dans le chemin de build d'application. La façon dont vous procédrez dépendra de votre décision de générer votre application avec Red Hat JBoss Developer Studio ou avec Maven.
- Quand vous générez avec Red Hat JBoss Developer Studio vous pouvez procéder en sélectionnant Project -> Properties à partir du menu Red Hat JBoss Developer Studio, en sélectionnant Targeted Runtimes et en veillant bien à vérifier le temps d'exécution de JBoss EAP 6.
- Quand vous générez avec Maven, vous pouvez procéder en ajoutant la configuration de dépendance suivante au fichier
pom.xmlde votre projet.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Vous n'avez pas besoin d'inclure les JAR de l'application générée car JBoss EAP 6 les fournit aux applications qui sont déployées.
Ajouter Imports
Ajouter les déclarations d'importation des espace-noms de classe JBoss Logging que vous allez utiliser. Vous devrez importer au minimumimport org.jboss.logging.Logger.import org.jboss.logging.Logger;
import org.jboss.logging.Logger;Copy to Clipboard Copied! Toggle word wrap Toggle overflow Créer un objet Logger
Créer une instance deorg.jboss.logging.Loggeret l'initialiser en utilisant la méthode statiqueLogger.getLogger(Class). Red Hat vous recommande de la créer en tant que variable à instance unique pour chaque classe.private static final Logger LOGGER = Logger.getLogger(HelloWorld.class);
private static final Logger LOGGER = Logger.getLogger(HelloWorld.class);Copy to Clipboard Copied! Toggle word wrap Toggle overflow Ajouter les messages de journalisation
Ajouter des appels aux méthodes de l'objetLoggerà votre code, là où vous souhaitez qu'il envoie des messages. L'objetLoggercomprend un certain nombre de méthodes contenant des paramètres différents suivant les types de messages. Les plus faciles à utiliser sont les suivants :debog(message objet)info(message objet)erreur(message objet)trace(message objet)fatal(message objet)Ces méthodes envoient un message de journalisation avec un niveau de journalisation correspondant et le paramètremessagecomme string.LOGGER.error("Configuration file not found.");LOGGER.error("Configuration file not found.");Copy to Clipboard Copied! Toggle word wrap Toggle overflow Pour obtenir une liste complète des méthodes JBoss Logging, consulter le packageorg.jboss.loggingdans JBoss EAP 6 API Documentation.
Exemple 5.1. Utilisation de JBoss Logging quand on ouvre un fichier de propriétés
5.3. La journalisation par déploiement Copier lienLien copié sur presse-papiers!
5.3.1. La journalisation par déploiement Copier lienLien copié sur presse-papiers!
5.3.2. La journalisation par déploiement vers une application Copier lienLien copié sur presse-papiers!
logging.properties au déploiement. Ce fichier de configuration est conseillé car il peut être utilisé avec n'importe quelle façade de journalisation dans la mesure où JBoss Log Manager est le gestionnaire de journalisation sous-jacent utilisé.
Simple Logging Facade for Java (SLF4J) ou Apache log4j, le fichier de configuration logging.properties est approprié. Si vous utilisez appenders de Apache log4j, alors la configuration fichier log4j.properties sera requise. Le fichier de configuration jboss-logging.properties est pris en charge uniquement pour les déploiements existants hérités.
Procédure 5.1. Ajouter le fichier de configuration à l'application
Le répertoire auquel le fichier de configuration est ajouté dépend de la méthode de déploiement :
EAR,WARouJAR.Déploiement
EARCopier le fichier de configuration de journalisation dans le répertoireMETA-INF.Déploiement
WARouJARCopier le fichier de configuration de journalisation dans le répertoireMETA-INFouWEB-INF/classes.
5.3.3. Exemple de fichier logging.properties Copier lienLien copié sur presse-papiers!
5.4. Profils de journalisation Copier lienLien copié sur presse-papiers!
5.4.1. Profils de journalisation Copier lienLien copié sur presse-papiers!
Important
- Un nom unique. Ceci est requis.
- N'importe quel nombre de log handlers.
- N'importe quelle catégorie log.
- Un root logger maximum.
MANIFEST.MF, en utilisant l'attribut logging-profile.
5.4.2. Spécifier un profil de journalisation dans une application Copier lienLien copié sur presse-papiers!
MANIFEST.MF.
Conditions préalables :
- Vous devez connaître le nom du profil de journalisation qui a été défini sur le serveur pour cette application. Demandez à votre administrateur de systèmes le nom du profil à utiliser.
Procédure 5.2. Ajouter une configuration de profil de journalisation à une application
Modifier
MANIFEST.MFSi votre application ne possède pas de fichierMANIFEST.MF: le créer avec le contenu suivant, en remplaçant NAME par le nom de profil qui convient.Manifest-Version: 1.0 Logging-Profile: NAME
Manifest-Version: 1.0 Logging-Profile: NAMECopy to Clipboard Copied! Toggle word wrap Toggle overflow Si votre application contient déjà un fichierMANIFEST.MF: ajouter la ligne suivante, en remplaçant NAME par le nom du profil qui convient.Logging-Profile: NAME
Logging-Profile: NAMECopy to Clipboard Copied! Toggle word wrap Toggle overflow
Note
maven-war-plugin, vous pourrez mettre votre fichier MANIFEST.MF dans src/main/resources/META-INF/ et ajouter la configuration suivante à votre fichier pom.xml.
Chapitre 6. Internationalisation et localisation Copier lienLien copié sur presse-papiers!
6.1. Introduction Copier lienLien copié sur presse-papiers!
6.1.1. Internationalisation Copier lienLien copié sur presse-papiers!
6.1.2. Localisation Copier lienLien copié sur presse-papiers!
6.2. Outils JBoss Logging Copier lienLien copié sur presse-papiers!
6.2.1. Aperçu Copier lienLien copié sur presse-papiers!
6.2.1.1. JBoss Logging Tools - Internationalisation et Localisation Copier lienLien copié sur presse-papiers!
org.jboss.logging. Il n'est pas nécessaire d'implémenter les interfaces, JBoss Logging Tools le fait au moment de la compilation. Une fois définies, vous pouvez utiliser ces méthodes pour enregistrer des messages ou obtenir des objets d'exception dans votre code.
6.2.1.2. JBoss Logging Tools Quickstart Copier lienLien copié sur presse-papiers!
logging-tools, contient un simple projet Maven qui démontre les fonctionnalités de JBoss Logging Tools. A été utilisé extensivement dans cette documentation pour les exemples de code.
6.2.1.3. Message Logger Copier lienLien copié sur presse-papiers!
@org.jboss.logging.MessageLogger.
6.2.1.4. Lot de messages Copier lienLien copié sur presse-papiers!
@org.jboss.logging.MessageBundle.
6.2.1.5. Messages de journalisation internationalisés Copier lienLien copié sur presse-papiers!
@LogMessage et @Message et spécifier le message de journalisation en utilisant l'attribut de la valeur de @Message. Les messages de journalisation internationalisés sont localisés en fournissant des traductions dans un fichier de propriétés.
6.2.1.6. Exceptions internationalisées Copier lienLien copié sur presse-papiers!
6.2.1.7. Messages internationalisés Copier lienLien copié sur presse-papiers!
6.2.1.8. Fichiers de propriétés de traduction Copier lienLien copié sur presse-papiers!
6.2.1.9. Codes de projets de JBoss Logging Tools Copier lienLien copié sur presse-papiers!
projectCode de l'annotation @MessageLogger.
6.2.1.10. Ids de messages de JBoss Logging Tools Copier lienLien copié sur presse-papiers!
id de l'annotation @Message.
6.2.2. Création de loggers, de messages ou d'exceptions internationalisés Copier lienLien copié sur presse-papiers!
6.2.2.1. Créer des messages log internationalisés Copier lienLien copié sur presse-papiers!
logging-tools pour trouver un exemple complet.
Prérequis :
- Vous devez déjà posséder un projet Maven en cours. Voir Section 6.2.6.1, « Configuration Maven JBoss Logging Tools ».
- Le projet doit avoir la configuration Maven qui convient pour JBoss Logging Tools.
Procédure 6.1. Créer un lot de messages log internationalisés
Créer une interface de Message Logger
Ajouter une interface Java à votre projet pour contenir les définitions de messages log. Définir l'interface de façon descriptive pour les messages log qui seront définis à l'intérieur.L'interface de messages log ont les prérequis suivants :- Doit être annotée par
@org.jboss.logging.MessageLogger. - Doit étendre
org.jboss.logging.BasicLogger. - L'interface doit définir un champ qui est un Logger typed qui impléemente cette interface. Procédez par la méthode
getMessageLogger()deorg.jboss.logging.Logger.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Ajouter les définitions de méthode
Ajouter une définition de méthode à l'interface de chaque message log. Nommez chaque méthode descriptivement par rapport au message log qu'elle représente.Chaque méthode a les prérequis suivants :- La méthode doit renvoyer
void. - La méthode doit être annotée par
@org.jboss.logging.LogMessage. - La méthode doit être annotée par
@org.jboss.logging.Message. - L'attribut de
@org.jboss.logging.Messagecontient le message log par défaut. Il s'agit du message qui est utilisé s'il n'y a pas de traduction.
@LogMessage @Message(value = "Customer query failed, Database not available.") void customerQueryFailDBClosed();
@LogMessage @Message(value = "Customer query failed, Database not available.") void customerQueryFailDBClosed();Copy to Clipboard Copied! Toggle word wrap Toggle overflow Le niveau de journalisation par défaut estINFO.Invoquer les méthodes
Ajouter les appels aux méthodes d'interface dans votre code là où les messages doivent être journalisés. Il n'est pas utile de créer des implémentations des interfaces, le processeur d'annotations le fait pour vous quand le projet est compilé.AccountsLogger.LOGGER.customerQueryFailDBClosed();
AccountsLogger.LOGGER.customerQueryFailDBClosed();Copy to Clipboard Copied! Toggle word wrap Toggle overflow Les loggers personnalisés sont des sous-classes de BasicLogger, donc les méthodes de journalisation deBasicLogger(debug(),error()etc) peuvent également être utilisées. Il n'est pas utile de créer d'autres loggers pour enregistrer les messages non internationalisés.AccountsLogger.LOGGER.error("Invalid query syntax.");AccountsLogger.LOGGER.error("Invalid query syntax.");Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.2.2.2. Créer et utiliser des messages internationalisés Copier lienLien copié sur presse-papiers!
logging-tools pour trouver un exemple complet.
Pré-requis
- Vous avez un projet Maven utilisant le référentiel JBoss EAP 6. Voir Section 2.3.2, « Configurer le référentiel JBoss EAP 6 Platform Maven Repository par les paramètres de configuration de Maven ».
- La configuration Maven requise pour JBoss Logging Tools a été ajoutée. Voir Section 6.2.6.1, « Configuration Maven JBoss Logging Tools ».
Procédure 6.2. Créer et utiliser des messages internationalisés
Créer une interface pour les exceptions.
JBoss Logging Tools définit les messages internationalisés dans les interfaces. Nommer chaque interface de manière descriptive pour les messages qui seront définis à l'intérieur.L'interface possède les prérequis suivants :- Elle doit être déclarée publique
- Elle doit être annotée par
@org.jboss.logging.MessageBundle. - L'interface doit définir un champ qui corresponde à un lot de messages du même type que l'interface.
@MessageBundle(projectCode="") public interface GreetingMessageBundle { GreetingMessageBundle MESSAGES = Messages.getBundle(GreetingMessageBundle.class); }@MessageBundle(projectCode="") public interface GreetingMessageBundle { GreetingMessageBundle MESSAGES = Messages.getBundle(GreetingMessageBundle.class); }Copy to Clipboard Copied! Toggle word wrap Toggle overflow Ajouter les définitions de méthode
Ajouter une définition de méthode dans l'interface de chaque message.Chaque méthode a les prérequis suivants :- Elle doit renvoyer un objet de type
String. - La méthode doit être annotée par
@org.jboss.logging.Message. - L'attribut
@org.jboss.logging.Messagedoit être défini à la valeur par défaut du message. Il s'agit du message qui est utilisé si aucune traduction n'est disponible.
@Message(value = "Hello world.") String helloworldString();
@Message(value = "Hello world.") String helloworldString();Copy to Clipboard Copied! Toggle word wrap Toggle overflow Méthodes d'invocation
Invoquer les méthodes d'interface dans votre application quand vous aurez besoin d'obtenir le message.System.console.out.println(helloworldString());
System.console.out.println(helloworldString());Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.2.2.3. Créer des exceptions personnalisées Copier lienLien copié sur presse-papiers!
logging-tools pour trouver un exemple complet.
Procédure 6.3. Créer et utiliser des exceptions internationalisées
Ajouter une configuration JBoss Logging Tools
Ajouter la configuration de projet qui convient pour prendre en charge JBoss Logging Tools. Voir Section 6.2.6.1, « Configuration Maven JBoss Logging Tools »Créer une interface pour les exceptions.
JBoss Logging Tools définit les exceptions internationalisées dans les interfaces. Nommer chaque interface de façon descriptive pour les exceptions qui seront décrites à l'intérieur.L'interface possède les prérequis suivants :- Elle doit être déclarée
public. - Elle doit être annotée par
@org.jboss.logging.MessageBundle. - L'interface doit définir un champ qui corresponde à un lot de messages du même type que l'interface.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Ajouter les définitions de méthode
Ajouter une définition de méthode à l'interface pour chaque exception. Nommez chaque méthode de façon descriptive pour chaque exception qu'elle représente.Chaque méthode a les prérequis suivants :- Elle doit renvoyer un objet du type
Exceptionou bien un sous-type d'Exception. - La méthode doit être annotée par
@org.jboss.logging.Message. - L'attribut de
@org.jboss.logging.Messagedoit être défini à la valeur du message d'exception par défaut. Il s'agit du message qui est utilisé s'il n'y a pas de traduction. - Si l'exception est retournée à un constructeur qui nécessite des paramètres en plus d'une chaîne de message, alors ces paramètres doivent être fournis dans la définition de méthode à l'aide de l'annotation
@param. Les paramètres doivent être du même type et du même ordre que le constructeur.
@Message(value = "The config file could not be opened.") IOException configFileAccessError(); @Message(id = 13230, value = "Date string '%s' was invalid.") ParseException dateWasInvalid(String dateString, @Param int errorOffset);
@Message(value = "The config file could not be opened.") IOException configFileAccessError(); @Message(id = 13230, value = "Date string '%s' was invalid.") ParseException dateWasInvalid(String dateString, @Param int errorOffset);Copy to Clipboard Copied! Toggle word wrap Toggle overflow Méthodes d'invocation
Invoquer les méthodes d'interface de votre code quand vous devrez obtenir une des exceptions. Les méthodes ne lancent pas d'exceptions, elles envoient l'objet d'exception que vous pourrez alors envoyer vous-même.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.2.3. Localisation de loggers, messages ou exceptions internationalisés Copier lienLien copié sur presse-papiers!
6.2.3.1. Générer des nouveaux fichiers de propriétés de traduction avec Maven Copier lienLien copié sur presse-papiers!
logging-tools pour trouver un exemple complet.
Conditions préalables :
- Vous devez déjà posséder un projet Maven en cours.
- Le projet devra avoir été configuré pour JBoss Logging Tools.
- Le projet doit contenir une ou plusieurs interfaces qui définissent des exceptions ou des messages de journalisation internationalisés
Procédure 6.4. Générer des nouveaux fichiers de propriétés de traduction avec Maven
Ajouter la configuration Maven
Ajouter l'argument de compilateur-AgenereatedTranslationFilePathà la configuration du plug-in du compilateur Maven et lui assigner le chemin d'accès où les nouveaux fichiers devront être créés.Copy to Clipboard Copied! Toggle word wrap Toggle overflow La configuration ci-dessus va créer des nouveaux fichiers dans le répertoiretarget/generated-translation-filesde votre projet Maven.Créer votre projet
Créer votre projet en utilisant Maven.mvn compile
[Localhost]$ mvn compileCopy to Clipboard Copied! Toggle word wrap Toggle overflow
@MessageBundle ou @MessageLogger. Les nouveaux fichiers sont créés dans un sous-répertoire qui correspond au package Java dans lequel chaque interface est déclarée.
InterfaceName comme nom d'interface pour laquelle ce fichier a été créé : InterfaceName.i18n_locale_COUNTRY_VARIANT.properties.
6.2.3.2. Traduire un logger, une exception ou un message internationalisé Copier lienLien copié sur presse-papiers!
logging-tools pour trouver un exemple complet.
Pré-requis
- Vous devez déjà posséder un projet Maven en cours.
- Le projet devra avoir été configuré pour JBoss Logging Tools.
- Le projet devra contenir une ou plusieurs interfaces qui définissent les exceptions ou message log d'internationalisation.
- Le projet devra être configuré pour générer des fichiers de propriétés modèles.
Procédure 6.5. Traduire un message, une exception ou un message internationalisé
Créer des fichiers de propriétés modèles
Exécuter la commandemvn compilepour créer les modèles de fichiers de propriétés de traduction.Ajouter le fichier modèle à votre projet.
Copier le modèle des interfaces que vous souhaitez traduire depuis le répertoire où elles ont été créées dans le répertoiresrc/main/resourcesde votre projet. Les fichiers de propriétés doivent figurer dans le même package des interfaces qu'ils traduisent.Renommer le fichier modèle copié
Renommer la copie du fichier modèle selon la traduction qu'il contient. Par exemple,GreeterLogger.i18n_fr_FR.properties.Traduire le contenu du modèle
Modifier le nouveau fichier de propriétés de traduction de manière à contenir la traduction appropriée.# Level: Logger.Level.INFO # Message: Hello message sent. logHelloMessageSent=Bonjour message envoyé.
# Level: Logger.Level.INFO # Message: Hello message sent. logHelloMessageSent=Bonjour message envoyé.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Répéter les étapes deux, trois et quatre pour chaque traduction de chaque lot exécuté.
target/generated-sources/annotations/.
6.2.4. Personnalisation des messages de journalisation internationalisés Copier lienLien copié sur presse-papiers!
6.2.4.1. Ajouter les ids de messages et les codes de projets aux messages de journalisation Copier lienLien copié sur presse-papiers!
logging-tools pour trouver un exemple complet.
Conditions préalables
- Vous devez déjà posséder un projet avec des messages de journalisation internationalisés. Voir Section 6.2.2.1, « Créer des messages log internationalisés ».
- Vous devrez connaître le code de projet que vous utilisez. Vous pouvez utiliser un code de projet simple, ou en définir un différent pour chaque interface.
Procédure 6.6. Ajouter les ids et les codes de projets aux messages de journalisation
Indiquer le code de projet de l'interface.
Indiquer le code du projet par l'attribut projectCode de l'annotation@MessageLoggerqui est attachée à une interface de logger personnalisée. Tous les messages définis dans l'interface utiliseront ce code de projet.@MessageLogger(projectCode="ACCNTS") interface AccountsLogger extends BasicLogger { }@MessageLogger(projectCode="ACCNTS") interface AccountsLogger extends BasicLogger { }Copy to Clipboard Copied! Toggle word wrap Toggle overflow Indiquer les ids de messages
Indiquer un id de message pour chaque message qui utilise un attributidde l'annotation@Messageliée à la méthode qui définit le message.@LogMessage @Message(id=43, value = "Customer query failed, Database not available.") void customerQueryFailDBClosed();
@LogMessage @Message(id=43, value = "Customer query failed, Database not available.") void customerQueryFailDBClosed();Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10:55:50,638 INFO [com.company.accounts.ejb] (MSC service thread 1-4) ACCNTS000043: Customer query failed, Database not available.
10:55:50,638 INFO [com.company.accounts.ejb] (MSC service thread 1-4) ACCNTS000043: Customer query failed, Database not available.
6.2.4.2. Indiquer le niveau de journalisation d'un message Copier lienLien copié sur presse-papiers!
INFO. Un niveau de journalisation différent peut être indiqué avec l'attribut level de l'annotation @LogMessage jointe à la méthode de journalisation.
Procédure 6.7. Indiquer le niveau de journalisation d'un message
Indiquer l'attribut du niveau
Ajouter l'attributlevelà l'annotation de@LogMessagede la définition de la méthode de message de journalisation.Allouer un niveau de journalisation
Allouer l'attributlevelà la valeur du niveau de journalisation de ce message. Les valeurs valides delevelsont les six constantes énumérées définies dansorg.jboss.logging.Logger.Level:DEBUG,ERROR,FATAL,INFO,TRACE, etWARN.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
ERROR.
10:55:50,638 ERROR [com.company.app.Main] (MSC service thread 1-4) Customer query failed, Database not available.
10:55:50,638 ERROR [com.company.app.Main] (MSC service thread 1-4)
Customer query failed, Database not available.
6.2.4.3. Personnaliser les messages de journalisation par des paramètres Copier lienLien copié sur presse-papiers!
Procédure 6.8. Personnaliser les messages de journalisation avec les paramètres
Ajouter des paramètres à la définition de la méthode
Les paramètres d'un type donné peuvent être ajoutés à la définition de la méthode. Quel que soit le type, la représentation String du paramètre est ce qui est affiché dans le message.Ajouter les références de paramètre dans le message de journalisation
Les références peuvent utiliser des indexations explicites ou ordinaires.- Pour utiliser des indexations ordinaires, insérer les caractères
%sdans la chaîne de message où vous souhaitez voir apparaître chaque paramètre. Le premier%sinsèrera le premier paramètre, le deuxième insèrera le deuxième paramètre, et ainsi de suite. - Pour les indexations explicites, insérer les caractères
%{#$}sdans le message où # indique le numéro du paramètre que vous souhaitez apercevoir.
Important
@Cause n'est pas inclus dans le nombre de paramètres.
Exemple 6.1. Paramètres de messages qui utilisent des indexations ordinaires.
@LogMessage(level=Logger.Level.DEBUG) @Message(id=2, value="Customer query failed, customerid:%s, user:%s") void customerLookupFailed(Long customerid, String username);
@LogMessage(level=Logger.Level.DEBUG)
@Message(id=2, value="Customer query failed, customerid:%s, user:%s")
void customerLookupFailed(Long customerid, String username);
Exemple 6.2. Paramètres de messages qui utilisent des indexations explicites
@LogMessage(level=Logger.Level.DEBUG) @Message(id=2, value="Customer query failed, user:%2$s, customerid:%1$s") void customerLookupFailed(Long customerid, String username);
@LogMessage(level=Logger.Level.DEBUG)
@Message(id=2, value="Customer query failed, user:%2$s, customerid:%1$s")
void customerLookupFailed(Long customerid, String username);
6.2.4.4. Indiquer une exception comme cause d'un message de journalisation Copier lienLien copié sur presse-papiers!
Throwable ou d'une de ses sous-classes et doit être marqué par l'annotation @Cause . Ce paramètre ne peut pas être référencé dans le message de journal comme les autres paramètres et il s'affiche à la suite du message de journalisation.
@Cause pour indiquer l'exception "cause". On suppose que vous avez déjà créé des messages de journalisation internationalisés auxquels vous souhaitez ajouter cette fonctionnalité.
Procédure 6.9. Indiquer une exception comme cause d'un message de journalisation
Ajouter le paramètre
Ajouter un paramètreThrowableou une sous-classe à la méthode.@LogMessage @Message(id=404, value="Loading configuration failed. Config file:%s") void loadConfigFailed(Exception ex, File file);
@LogMessage @Message(id=404, value="Loading configuration failed. Config file:%s") void loadConfigFailed(Exception ex, File file);Copy to Clipboard Copied! Toggle word wrap Toggle overflow Ajouter l'annotation
Ajouter l'annotation@Causeau paramètre.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Invoquer la méthode
Quand la méthode est invoquée dans votre code, un objet du type qui convient devra être passé et sera affiché à la suite du message de journalisation.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Vous trouverez ci-dessous la sortie des extraits de code ci-dessus, si le code a lancé une exception de typeFileNotFoundException.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.2.5. Personnalisation des exceptions internationalisées Copier lienLien copié sur presse-papiers!
6.2.5.1. Ajouter les ids et les codes de projets aux messages d'exceptions Copier lienLien copié sur presse-papiers!
Conidtions préalables
- Vous devrez déjà avoir un projet avec des exceptions internationalisées. Voir Section 6.2.2.3, « Créer des exceptions personnalisées ».
- Vous devrez connaître le code de projet que vous utilisez. Vous pouvez utiliser un code de projet simple, ou en définir un différent pour chaque interface.
Procédure 6.10. Ajouter les ids et les codes de projets aux messages d'exceptions
Indiquer un code de projet
Indiquer le code de projet en utilisant l'attributprojectCodede l'annotation@MessageBundleattachée à une interface de lot d'exceptions. Tous les messages qui sont définis dans l'interface utiliseront ce code de projet.@MessageBundle(projectCode="ACCTS") interface ExceptionBundle { ExceptionBundle EXCEPTIONS = Messages.getBundle(ExceptionBundle.class); }@MessageBundle(projectCode="ACCTS") interface ExceptionBundle { ExceptionBundle EXCEPTIONS = Messages.getBundle(ExceptionBundle.class); }Copy to Clipboard Copied! Toggle word wrap Toggle overflow Indiquer les ID de messages
Indiquer l'id de message pour chaque exception en utilisant l'attributidde l'annotation@Messageassociée à la méthode qui définit l'exception.@Message(id=143, value = "The config file could not be opened.") IOException configFileAccessError();
@Message(id=143, value = "The config file could not be opened.") IOException configFileAccessError();Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Important
Exemple 6.3. Créer des exceptions internationalisées
throw ExceptionBundle.EXCEPTIONS.configFileAccessError();
throw ExceptionBundle.EXCEPTIONS.configFileAccessError();
Exception in thread "main" java.io.IOException: ACCTS000143: The config file could not be opened. at com.company.accounts.Main.openCustomProperties(Main.java:78) at com.company.accounts.Main.go(Main.java:53) at com.company.accounts.Main.main(Main.java:43)
Exception in thread "main" java.io.IOException: ACCTS000143: The config file could not be opened.
at com.company.accounts.Main.openCustomProperties(Main.java:78)
at com.company.accounts.Main.go(Main.java:53)
at com.company.accounts.Main.main(Main.java:43)
6.2.5.2. Personnaliser les messages d'exception avec des paramètres Copier lienLien copié sur presse-papiers!
Procédure 6.11. Personnaliser les messages d'exception avec les paramètres
Ajouter des paramètres à la définition de la méthode
Les paramètres d'un type donné peuvent être ajoutés à la définition de la méthode. Quel que soit le type, la représentationStringdu paramètre est ce qui est affiché dans le message.Ajouter les références de paramètre au message d'exception
Les références peuvent utiliser des indexations explicites ou ordinaires.- Pour utiliser des indexations ordinaires, insérer les caractères
%sdans la chaîne de message où vous souhaitez voir apparaître chaque paramètre. Le premier%sinsèrera le premier paramètre, le deuxième insèrera le deuxième paramètre, et ainsi de suite. - Pour les indexations explicites, insérer les caractères
%{#$}sdans le message où#indique le numéro du paramètre que vous souhaitez apercevoir.
L'utilisation des indexations explicites permet aux références de paramètres du message d'être dans un ordre différent que celui défini dans la méthode. C'est important pour les messages traduits qui peuvent nécessiter un ordonnancement des paramètres différent.
Important
@Cause n'est pas inclus dans le nombre de paramètres.
Exemple 6.4. Utilisation des indexations ordinaires
@Message(id=2, value="Customer query failed, customerid:%s, user:%s") void customerLookupFailed(Long customerid, String username);
@Message(id=2, value="Customer query failed, customerid:%s, user:%s")
void customerLookupFailed(Long customerid, String username);
Exemple 6.5. Utilisation des indexations explicites
@Message(id=2, value="Customer query failed, user:%2$s, customerid:%1$s") void customerLookupFailed(Long customerid, String username);
@Message(id=2, value="Customer query failed, user:%2$s, customerid:%1$s")
void customerLookupFailed(Long customerid, String username);
6.2.5.3. Indiquer une exception comme cause d'une autre exception Copier lienLien copié sur presse-papiers!
@Cause. Ce paramètre est utilisé pour passer l'exception de «cause». Ce paramètre ne peut pas être référencé dans le message d'exception.
@Cause pour indiquer l'exception de « cause ». On suppose que vous avez déjà créé des messages de journalisation internationalisés auxquels vous souhaitez ajouter cette fonctionnalité.
Procédure 6.12. Indiquer une exception comme « cause » d'une autre exception
Ajouter le paramètre
Ajouter un paramètreThrowableou une sous-classe à la méthode.@Message(id=328, value = "Error calculating: %s.") ArithmeticException calculationError(Throwable cause, String msg);
@Message(id=328, value = "Error calculating: %s.") ArithmeticException calculationError(Throwable cause, String msg);Copy to Clipboard Copied! Toggle word wrap Toggle overflow Ajouter l'annotation
Ajouter l'annotation@Causeau paramètre.import org.jboss.logging.Cause @Message(id=328, value = "Error calculating: %s.") ArithmeticException calculationError(@Cause Throwable cause, String msg);
import org.jboss.logging.Cause @Message(id=328, value = "Error calculating: %s.") ArithmeticException calculationError(@Cause Throwable cause, String msg);Copy to Clipboard Copied! Toggle word wrap Toggle overflow Invoquer la méthode
Invoquer la méthode d'interface pour obtenir un objet d'exception. Le cas d'utilisation le plus commun est de lancer une exception à partir d'un catch block en utilisant l'exception récupérée comme « cause ».Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Exemple 6.6. Indiquer une exception comme « cause » d'une autre exception
6.2.6. Référence Copier lienLien copié sur presse-papiers!
6.2.6.1. Configuration Maven JBoss Logging Tools Copier lienLien copié sur presse-papiers!
pom.xml :
logging-tools pour obtenir un exemple de fichier pom.xml complet.
- Le référentiel JBoss Maven Repository doit être activé pour le projet. Voir Section 2.3.2, « Configurer le référentiel JBoss EAP 6 Platform Maven Repository par les paramètres de configuration de Maven ».
- Les dépendances Maven de
jboss-loggingetjboss-logging-processordoivent être ajoutées. Les deux dépendances sont disponibles sur JBoss EAP 6, ainsi l'élément scope de chaque dépendance peut être définie commeprovidedtel qu'il a été montré.Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Le
maven-compiler-plugindoit utiliser au minimum la version2.2et être configuré pour la cible et les sources générées de1.6.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.2.6.2. Format de fichier de propriétés de traduction Copier lienLien copié sur presse-papiers!
key=value simple, orienté-ligne, décrit dans la documentation pour la classe java.util.Properties, http://docs.oracle.com/javase/6/docs/api/java/util/Properties.html.
InterfaceName.i18n_locale_COUNTRY_VARIANT.properties
InterfaceName.i18n_locale_COUNTRY_VARIANT.properties
InterfaceNameest le nom de l'interface où les traductions s'appliquent.locale,COUNTRY, etVARIANTidentifient les paramètres régionaux correspondant à la traduction.localeetCOUNTRYindiquent la langue et le pays en utilisant respectivement les codes Langues et Pays ISO-639 et ISO-3166.COUNTRYest optionnel.VARIANTest un identifiant optionnel pouvant être utilisé pour identifier les traductions qui ne s'appliquent qu'à un système d'exploitation ou à un navigateur en particulier.
Exemple 6.7. Échantillon de fichier de propriétés de traductions
GreeterService.i18n_fr_FR_POSIX.properties.
# Level: Logger.Level.INFO # Message: Hello message sent. logHelloMessageSent=Bonjour message envoyé.
# Level: Logger.Level.INFO
# Message: Hello message sent.
logHelloMessageSent=Bonjour message envoyé.
6.2.6.3. Références aux annotations de JBoss Logging Tools Copier lienLien copié sur presse-papiers!
| Annotation | Cible | Description | Attributs |
|---|---|---|---|
@MessageBundle | Interface |
Définit l'interface en tant que Lot de Messages
| projectCode |
@MessageLogger | Interface |
Définit l'interface en tant que Message Logger
| projectCode |
@Message | Méthode |
Peut être utilisé dans les Lots de Messages et Message Loggers. Dans un Message Logger, définit une méthode comme étant un logger localisé. Dans un Lot de Messages, définit la méthode comme étant une méthode qui renvoie une Chaîne localisées ou un objet d'Exception.
| value, id |
@LogMessage | Méthode |
Définit une méthode dans un Message Logger comme étant une méthode de logging.
| level (default INFO) |
@Cause | Paramètre |
Définit un paramètre comme étant un paramètre faisant passer une exception en tant que cause d'un Message Log ou autre exception.
| - |
@Param | Paramètre |
Définit un paramètre comme étant un paramètre passé au constructeur d'une Exception.
| - |
Chapitre 7. Enterprise JavaBeans Copier lienLien copié sur presse-papiers!
7.1. Introduction Copier lienLien copié sur presse-papiers!
7.1.1. Entreprise JavaBeans Copier lienLien copié sur presse-papiers!
7.1.2. Groupe de fonctionnalités EJB 3.1 Copier lienLien copié sur presse-papiers!
- Session Beans
- Message Driven Beans
- Vues non-interfaces
- Interfaces locales
- Interfaces distantes
- Services web JAX-WS
- Services web JAX-RS
- Service de minuterie
- Appels asynchrones
- Intercepteurs
- Interopérabilité RMI/IIOP
- Support de transaction
- Sécurité
- API intégrable
- Entity Beans (persistance gérée-bean et conteneur))
- Vues client Entity Beans EJB 2.1
- EJB Query Language (EJB QL)
- Services Web basés JAX-RPC (points de terminaison et vues client)
7.1.3. EJB 3.1 Lite Copier lienLien copié sur presse-papiers!
- ne supportant que les fonctionnalités qui sont utiles pour les applications-web, et
- en permettant aux EJB d'être déployés dans le même fichier WAR sous forme d'application web.
7.1.4. Fonctionnalités EJB 3.1 Lite Copier lienLien copié sur presse-papiers!
- Session Beans sans état, avec état, et singleton
- Interfaces commerciales locales et beans "sans interface"
- Intercepteurs
- Transactions gérées-conteneur et gérées-bean
- Sécurité déclarative et programmatique
- API intégrable
- Interfaces éloignées
- Intéropérabilité RMI-IIOP
- Ponts de terminaison de services web JAX-WS
- Service de minuterie EJB
- Invocations de session beans asynchrones
- Message-driven beans
7.1.5. Beans Enterprise Copier lienLien copié sur presse-papiers!
Important
7.1.6. Écriture des beans Enterprise Copier lienLien copié sur presse-papiers!
7.1.7. Interfaces Métier de Session Bean Copier lienLien copié sur presse-papiers!
7.1.7.1. Interfaces de métier Bean Enterprise Copier lienLien copié sur presse-papiers!
7.1.7.2. Interfaces de métier locales EJB Copier lienLien copié sur presse-papiers!
7.1.7.3. Interfaces métier à distance EJB Copier lienLien copié sur presse-papiers!
7.1.7.4. Beans EJB no-interface Copier lienLien copié sur presse-papiers!
7.2. Créer des projets Enterprise Bean Copier lienLien copié sur presse-papiers!
7.2.1. Créer un projet d'archives EJB avec le Red Hat Studio JBoss Developer Copier lienLien copié sur presse-papiers!
Conditions préalables
- Un serveur et un runtime de serveur pour JBoss EAP 6 a été installé. Veuillez vous référer à Section 1.3.1.5, « Ajouter le serveur de JBoss EAP en utilisant Define New Server » .
Procédure 7.1. Créer un projet EJB dans le Red Hat JBoss Developer Studio
Créer un nouveau projet
Pour ouvrir l'Assistant New EJB Project, naviguer jusqu'au menu , sélectionner puis .Figure 7.1. Assistant New EJB Project
Détails
Fournir les informations suivantes :- Nom du projet.Il s'agira du nom du projet qui apparaît dans Red Hat JBoss Developer Studio, et également le nom du fichier par défaut du fichier JAR déployé.
- Emplacement du projetLe répertoire où les fichiers du projet seront sauvegardés. La valeur par défaut est un répertoire qui se trouve dans l'espace de travail en cours.
- Runtime cible.Il s'agit du runtime de serveur utilisé pour le projet. Il devra être défini au même runtime JBoss EAP 6, qui est utilisé par le serveur dans lequel vous souhaitez déployer.
- Version de module EJB. Il s'agit de la version de la spécification EJB avec laquelle vos beans enterprise devront se conformer. Red Hat recommande que vous utilisiez
3.1. - Configuration. Cela vous permet d'ajuster les fonctionnalités prises en charge par votre projet. Utiliser la configuration par défaut pour le runtime que vous avez sélectionné.
Cliquer sur pour continuer.Java Build Configuration
Cet écran vous permet de personnaliser les répertoires qui contiennent les fichiers source de Java et le répertoire où les résultats de la génération se trouvent.Conservez cette configuration sans y apporter aucun changement et cliquer sur le bouton .Paramétrage du Module EJB
Cocher la case Générer descripteur de déploiement ejb-jar.xml si un descripteur de déploiement est requis. Le descripteur de déploiement est une option dans EJB 3.1, et peut être rajouté plus tard si nécessaire.Cliquer sur le bouton et le projet sera créé. Il s'affichera dans Project Explorer.Figure 7.2. Nouveau projet EJB créé dans Project Explorer
Ajouter l'artifact généré dans le serveur en vue du déploiement
Ouvrir le dialogue Ajouter et Supprimer en cliquant à droite sur le serveur dans lequel vous souhaitez générer l'artefact dans l'onglet serveur, et sélectionner 'Ajouter et Supprimer'.Sélectionner la ressource à déployer à partir de la colonne Disponible et cliquer sur le bouton . La ressource sera déplacée dans la colonne Configurer, Cliquer sur pour fermer le dialogue.Figure 7.3. Ajouter et Supprimer le dialogue
Vous avez maintenant un Projet EJB dans Red Hat JBoss Developer Studio pouvant être généré et déployé pour un serveur spécifique.
7.2.2. Créer un projet EJB Archive dans Maven. Copier lienLien copié sur presse-papiers!
Prérequis :
- Maven est déjà installé.
- Vous comprenez les bases d'utilisation de Maven.
Procédure 7.2. Créer un projet EJB Archive dans Maven
Créer le projet Maven
Un projet EJB peut être créé en utilisant le système archétype de Maven et l'archétypeejb-javaee6. Pour ce faire, exécuter la commandemvnavec les paramètres suivants :mvn archetype:generate -DarchetypeGroupId=org.codehaus.mojo.archetypes -DarchetypeArtifactId=ejb-javaee6
mvn archetype:generate -DarchetypeGroupId=org.codehaus.mojo.archetypes -DarchetypeArtifactId=ejb-javaee6Copy to Clipboard Copied! Toggle word wrap Toggle overflow Maven vous demandera legroupId, leartifactId, laversionet lepackagede votre projet.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Ajouter vos beans enterprise
Ecrire vos beans enterprise et les ajouter au projet sous le répertoiresrc/main/javadans le sous-répertoire approprié pour le paquetage du bean.Créer votre projet
Pour construire ce projet, exécuter la commandemvn packagedans le même répertoire que le fichierpom.xml. Cela compilera les classes Java et empaquettera le fichier JAR. Le fichier JAR construit se nommeartifactId-version.jaret se trouve dans le répertoiretarget/.
7.2.3. Créer un projet EAR contenant un projet EJB Copier lienLien copié sur presse-papiers!
Conditions préalables
- Un serveur et un runtime de serveur pour JBoss EAP 6 a été installé. Veuillez vous référer à Section 1.3.1.5, « Ajouter le serveur de JBoss EAP en utilisant Define New Server ».
Procédure 7.3. Créer un projet EAR contenant un projet EJB
Ouvrir le nouvel Assistant de Projet de l'Application EAR.
Naviguer vers le menu , sélectionner , puis et l'assistant Nouveau Projet apparaîtra. Sélectionner et cliquer sur le bouton .Figure 7.4. Nouvel Assistant de Projet de l'Application EAR.
Fournir des Informations
Fournir les informations suivantes :- Nom du projet.Il s'agira du nom du projet qui apparaît dans Red Hat JBoss Developer Studio, et également le nom du fichier par défaut du fichier EAR déployé.
- Emplacement du projetLe répertoire où les fichiers du projet seront sauvegardés. La valeur par défaut est un répertoire qui se trouve dans l'espace de travail en cours.
- Runtime cible.Il s'agit du runtime de serveur utilisé pour le projet. Il devra être défini au même runtime JBoss EAP 6, qui est utilisé par le serveur dans lequel vous souhaitez déployer.
- Version EAR.C'est la version des spécifications de Java Enterprise Edition auquel votre projet devra se conformer. Red Hat recommande d'en utiliser
6. - Configuration. Cela vous permet d'ajuster les fonctionnalités prises en charge par votre projet. Utiliser la configuration par défaut pour le runtime que vous avez sélectionné.
Cliquer sur pour continuer.Ajouter un nouveau module EJB.
Les nouveaux Modules peuvent être ajoutés à partir de la page Enterprise Application de l'assistant. Pour ajouter un nouveau Projet EJB en tant que module, veuillez suivre les étapes suivantes :Ajouter un nouveau Module EJB.
Cliquer sur , décocher la case Créer Modules par Défaut, sélectionner Enterprise Java Bean et cliquer sur . L'assistant Nouveau Projet EJB apparaîtra.Créer un Projet EJB.
L'assistant Nouveau Projet EJB est le même que l'assistant utilisé pour créer de nouveaux projets EJB autonomes et est décrit dans Section 7.2.1, « Créer un projet d'archives EJB avec le Red Hat Studio JBoss Developer ».Les détails minimales requis pour créer le project sont les suivants :- Nom du Projet
- Runtime de la cible
- Version Module EJB
- Configuration
Toutes les autres étapes de l'assistant sont optionnelles. Cliquer sur pour finir de créer le Projet EJB.
Le Projet EJB tout juste créé est listé dans les dépendances du module Java EE et la case est cochée.Optionnel : ajouter un descripteur de déploiement application.xml
Cocher la case Générer descripteur de déploiement d'application.xml le cas échéant.Cliquer sur Finish
Deux nouveaux projets vont apparaître, le projet EJB et le projet EAR.Ajouter l'artifact généré dans le serveur en vue du déploiement
Ouvrir la boîte de dialogue Ajouter et Supprimer en cliquant avec le bouton droit de la souris, dans l'onglet Serveurs, sur le serveur dans lequel vous souhaitez déployer l'artéfact de la build dans l'onglet serveur, et sélectionner .Sélectionner la ressource EAR à déployer depuis la colonne Disponible et cliquer sur le bouton . La ressource sera déplacée vers la colonne Configuré. Cliquer sur pour fermer la boîte de dialogue.Figure 7.5. Ajouter et Supprimer le dialogue
Vous avez maintenant un Projet d'Application Enterprise avec un Projet EJB membre. Celui-ci se créera et se déploiera vers le serveur indiqué en tant que déploiement EAR unique contenant un sous-déploiement EJB.
7.2.4. Ajouter un descripteur de déploiement à un projet EJB Copier lienLien copié sur presse-papiers!
Conditions préalables :
- Vous avez un projet EJB dans Red Hat JBoss Developer Studio auquel vous souhaitez ajouter un descripteur de déploiement EJB.
Procédure 7.4. Ajouter un descripteur de déploiement à un projet EJB.
Ouvrir le projet
Ouvrir un projet dans Red Hat JBoss Developer Studio.Ajouter un descipteur de déploiement
Cliquer à droite sur le dossier Descripteur de déploiement dans la vue du projet et sélectionner (Générer Descripteur de déploiement).Figure 7.6. Ajouter un descripteur de déploiement
ejb-jar.xml, sera créé dans ejbModule/META-INF/. Cliquer deux fois dans le dossier Descripteur de déploiement dans la vue du projet, ce qui permettra d'ouvrir ce fichier également.
7.3. Session Beans Copier lienLien copié sur presse-papiers!
7.3.1. Session Beans Copier lienLien copié sur presse-papiers!
7.3.2. Stateless Session Beans Copier lienLien copié sur presse-papiers!
7.3.3. Stateful Session Beans Copier lienLien copié sur presse-papiers!
7.3.4. Singleton Session Beans Copier lienLien copié sur presse-papiers!
7.3.5. Ajouter des Session Beans à un Projet dans Red Hat JBoss Developer Studio Copier lienLien copié sur presse-papiers!
Conditions préalables :
- Vous avec un EJB ou Dynamic Web Project dans Red Hat JBoss Developer Studio auquel vous souhaitez ajouter un ou plusieurs session beans.
Procédure 7.5. Ajouter des Session Beans à un Projet dans Red Hat JBoss Developer Studio
Ouvrir le projet
Ouvrir un projet dans Red Hat JBoss Developer Studio.Ouvrir l'assistant "Create EJB 3.x Session Bean" (Créer EJB 3.x Session Bean)
Pour ouvrir l'assistant Créer EJB 3.x Session Bean, naviguer dans le menu , et sélectionner , puis .Figure 7.7. Créer un assistant EJB 3.x Session Bean
Indiquer les informations de classe
Fournir les informations suivantes :- ProjetVerifier que le projet qui convient a bien été sélectionné.
- Dossier sourceIl s'agit du dossier dans lequel les fichiers source de Java seront créés. Cela n'a pas normalement besoin d'être changé.
- PackageIndiquer le package auquel cette classe appartient.
- Nom de la classeIndiquer le nom de la classe qui représentera le session bean.
- SuperclassLa classe de session bean peut hériter d'une Superclass. Indiquer ici si votre session a une Superclass.
- Type d'étatIndiquer le type d'état du session bean: stateless, stateful, ou singleton.
- Interfaces commercialesPar défaut, la case No-interface est cochée, donc aucune interface ne sera créée. Cocher les cases des interfaces que vous souhaitez définir et ajuster les noms si nécessaire.Nous vous rappelons que les beans Enterprise d'un WAR (Web Archive) ne supportent qu'EJB 3.1 Lite, et que cela n'inclut pas les interfaces commerciales distantes.
Cliquer sur .Informations spécifiques aux Session Bean
Vous pouvez saisir des informations supplémentaires ici pour personnaliser encore plus le session bean. Vous n'avez pas besoin de changer quoi que ce soit ici.Les items que vous pouvez changer sont :- Nom de bean.
- Nom mappé.
- Type de transaction (géré conteneur ou géré bean).
- On peut fournir des interfaces supplémentaires que le bean doit implémenter.
- Vous pouvez également spécifier des interfaces EJB 2.x Home et Component si nécessaire.
Terminer
Cliquer sur le bouton et le nouveau session bean sera créé, et ajouté au projet. Les fichiers de toute nouvelle interface commerciale seront également créés, s'ils ont été spécifiés.
Figure 7.8. Nouveau Session Bean dans Red Hat JBoss Developer Studio
7.4. Message-Driven Beans Copier lienLien copié sur presse-papiers!
7.4.1. Message-Driven Beans Copier lienLien copié sur presse-papiers!
7.4.2. Adaptateurs de ressources Copier lienLien copié sur presse-papiers!
7.4.3. Créer un Message-Driven Bean basé JMS dans Red Hat JBoss Developer Studio Copier lienLien copié sur presse-papiers!
Conditions préalables :
- Vous devrez avoir un projet existant ouvert dans Red Hat JBoss Developer Studio.
- Vous devrez connaître le nom et le type de la destination JMS que le bean écoutera.
- Le support pour JMS (Java Messaging Service) doit être autorisé dans la configuration JBoss EAP 6 dans laquelle ce bean sera déployé.
Procédure 7.6. Ajouter un Message-Driven Bean basé JMS dans Red Hat JBoss Developer Studio
Ouvrir l'assistant Create EJB 3.x Message-Driven Bean
Aller à → → . Sélectionner EJB/Message-Driven Bean (EJB 3.x) et cliquer sur le bouton .Figure 7.9. Créer l'assistant Message-Driven Bean EJB 3.x
Indiquer les détails de la destination de fichier de classe
Il existe trois ensembles de détails à indiquer pour la classe de bean : le projet, la classe Java et le message de destination.- Projet
- Si plusieurs projets existent dans Workspace, veillez à ce que le bon projet soit sélectionné dans le menu .
- Le dossier où le fichier source du nouveau bean sera créé est
ejbModulesous le répertoire du projet sélectionné. Ne peut être changé que pour répondre à des cas particuliers.
- Classe Java
- Les champs obligatoires sont les suivants : Java Package et class name.
- Il n'est pas nécessaire de fournir une Superclass à moins que la logique commerciale de votre application ne l'exige.
- Destination du message
- Voici les informations à fournir pour un Message-Driven Bean basé JMS :
- Destination name. C'est la file d'attente ou le nom du sujet qui contient les messages auxquels le bean répondra.
- La case JMS est sélectionnée par défaut. Veuillez ne pas la changer.
- Définir Destination type comme Queue ou Topic selon ce que l'on vous demande.
Cliquer sur le bouton .Saisir les informations spécifiques aux Message-Driven Bean
Les valeurs par défaut sont appropriées pour un Message-Driven Bean basé JMS utilisant des transactions gérées conteneur.- Changer le type de transaction à Bean si le Bean doit utiliser des transactions Bean-managed (gérées bean).
- Changer le nom du Bean s'il est demandé un nom de bean différent du nom de classe.
- L'interface JMS Message Listener sera déjà listée. Vous n'aurez pas besoin d'ajouter ou de supprimer des interfaces, à moins qu'elles soient spécifiques à votre logique commerciale d'applications.
- Laisser les cases décochées pour créer les méthodes stub sélectionnées.
Cliquer sur le bouton .
onMessage(). Une fenêtre d'édition de Red Hat JBoss Developer Studio est apparue avec le fichier correspondant.
7.4.4. Spécifier un adaptateur de ressources dans jboss-ejb3.xml pour un MDB Copier lienLien copié sur presse-papiers!
jboss-ejb3.xml, vous pouvez spécifier un adaptateur de ressources pour utiliser un MDB. Sinon, pour configurer un adaptateur de ressources JBoss EAP 6 par défaut, voir Configurer les Message-Driven Beans dans le Guide d'Administration et de Configuration.
jboss-ejb3.xml pour un MDB, utilisez l'exemple suivant :
Exemple 7.1. jboss-ejb3.xml Exemple de configuration pour un adaptateur de ressource MDB
<mdb:resource-adapter-name> :
- Pour un adaptateur de ressource dans un autre EAR :
<mdb:resource-adapter-name>OtherDeployment.ear#MyResourceAdapter.rar</mdb:resource-adapter-name>
<mdb:resource-adapter-name>OtherDeployment.ear#MyResourceAdapter.rar</mdb:resource-adapter-name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Pour un adaptateur de ressource situé dans le même EAR que le MDB, vous pouvez omettre le nom de EAR :
<mdb:resource-adapter-name>#MyResourceAdapter.rar</mdb:resource-adapter-name>
<mdb:resource-adapter-name>#MyResourceAdapter.rar</mdb:resource-adapter-name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.4.5. Activer la substitution de propriété des EJB et MDB dans une application Copier lienLien copié sur presse-papiers!
@ActivationConfigProperty et @Resource. La substitution de propriétés nécessite la configuration et les changements de code suivants :
- Vous devez activer la substitution de propriété dans le fichier de configuration du serveur JBoss EAP.
- Vous devez définir les propriétés système dans le fichier de configuration du serveur ou les passer comme arguments quand vous démarrez le serveur JBoss EAP.
- Vous devez modifier le code pour utiliser les variables de substitution.
Procédure 7.7. Implémenter la substitution de propriétés dans une application MDB
helloworld-mdb fourni dans JBoss EAP 6.3 ou version supérieure. Cette section vous montre comment modifier le guide de démarrage rapide pour activer la substitution de propriété.
Configurer le serveur JBoss EAP pour activer la substituion de propriété.
Le serveur JBoss EAP doit être configuré pour activer la substitution de propriété. Pour cela, définir l'attribut<annotation-property-replacement>qui se trouve dans le sous-systèmeeedu fichier de configuration du serveur àtrue.- Sauvegarder le fichier de configuration du serveur. L'exemple de guide de démarrage rapide
helloworld-mdbnécessite un profil complet pour les serveurs autonomes, donc il s'agit dustandalone/configuration/standalone-full.xml. Si vous exécutez votre serveur dans un domaine géré, il s'agira du fichierdomain/configuration/domain.xml. - Démarrer le serveur JBos EAP avec le profil complet.Dans Linux :Dans Windows :
EAP_HOME/bin/standalone.sh -c standalone-full.xml
EAP_HOME/bin/standalone.sh -c standalone-full.xmlCopy to Clipboard Copied! Toggle word wrap Toggle overflow EAP_HOMEbin\standalone.bat -c standalone-full.xml
EAP_HOMEbin\standalone.bat -c standalone-full.xmlCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Lancer l'interface CLI par la commande pour votre système d'exploitation.Dans Linux :Dans Windows :
EAP_HOME/bin/jboss-cli.sh --connect
EAP_HOME/bin/jboss-cli.sh --connectCopy to Clipboard Copied! Toggle word wrap Toggle overflow EAP_HOME\bin\jboss-cli.bat --connect
EAP_HOME\bin\jboss-cli.bat --connectCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Saisir la commande suivante pour activer la substitution de propriété d'annotation.
/subsystem=ee:write-attribute(name=annotation-property-replacement,value=true)
/subsystem=ee:write-attribute(name=annotation-property-replacement,value=true)Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Vous devriez voir apparaître le résultat suivant :
{"outcome" => "success"}{"outcome" => "success"}Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Réviser les changements apportés au fichier de configuration du serveur JBoss EAP. Le sous-système
eedoit maintenant contenir l'XML suivant.<subsystem xmlns="urn:jboss:domain:ee:1.2"> <spec-descriptor-property-replacement>false</spec-descriptor-property-replacement> <jboss-descriptor-property-replacement>true</jboss-descriptor-property-replacement> <annotation-property-replacement>true</annotation-property-replacement> </subsystem><subsystem xmlns="urn:jboss:domain:ee:1.2"> <spec-descriptor-property-replacement>false</spec-descriptor-property-replacement> <jboss-descriptor-property-replacement>true</jboss-descriptor-property-replacement> <annotation-property-replacement>true</annotation-property-replacement> </subsystem>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Définir les propriétés système.
Vous pouvez spécifier les propriétés du système dans le fichier de configuration du serveur ou vous pouvez les passer comme arguments de ligne de commande lorsque vous démarrez le serveur JBoss EAP. Les propriétés système définies dans le fichier de configuration de serveur ont la priorité sur celles passées sur la ligne de commande lorsque vous démarrez le serveur.- Vous devez définir les propriétés système dans le fichier de configuration.
- Démarrez le serveur JBoss EAP et le Management API comme indiqué dans les étapes précédentes.
- Utiliser la syntaxe de commande suivante pour configurer une propriété système dans le serveur JBoss EAP :
/system-property=PROPERTY_NAME:add(value=PROPERTY_VALUE)
/system-property=PROPERTY_NAME:add(value=PROPERTY_VALUE)Copy to Clipboard Copied! Toggle word wrap Toggle overflow Pour le guide de démarrage rapidehelloworld-mdb, nous configurons les propriétés système suivantes :/system-property=property.helloworldmdb.queue:add(value=java:/queue/HELLOWORLDMDBPropQueue) /system-property=property.helloworldmdb.topic:add(value=java:/topic/HELLOWORLDMDBPropTopic) /system-property=property.connection.factory:add(value=java:/ConnectionFactory)
/system-property=property.helloworldmdb.queue:add(value=java:/queue/HELLOWORLDMDBPropQueue) /system-property=property.helloworldmdb.topic:add(value=java:/topic/HELLOWORLDMDBPropTopic) /system-property=property.connection.factory:add(value=java:/ConnectionFactory)Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Réviser les changements apportés au fichier de configuration du serveur JBoss EAP. Les propriétés système suivantes doivent maintenant apparaître après les
<extensions>.<system-properties> <property name="property.helloworldmdb.queue" value="java:/queue/HELLOWORLDMDBPropQueue"/> <property name="property.helloworldmdb.topic" value="java:/topic/HELLOWORLDMDBPropTopic"/> <property name="property.connection.factory" value="java:/ConnectionFactory"/> </system-properties><system-properties> <property name="property.helloworldmdb.queue" value="java:/queue/HELLOWORLDMDBPropQueue"/> <property name="property.helloworldmdb.topic" value="java:/topic/HELLOWORLDMDBPropTopic"/> <property name="property.connection.factory" value="java:/ConnectionFactory"/> </system-properties>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- Passez les propriétés système comme arguments de ligne de commande quand vous démarrez le serveur JBoss EAP sous la forme d'un
-DPROPERTY_NAME=PROPERTY_VALUE. Ce qui suit est un exemple de la façon dont on passe les arguments dans les propriétés système définies dans l'étape précédente.EAP_HOME/bin/standalone.sh -c standalone-full.xml -Dproperty.helloworldmdb.queue=java:/queue/HELLOWORLDMDBPropQueue -Dproperty.helloworldmdb.topic=java:/topic/HELLOWORLDMDBPropTopic -Dproperty.connection.factory=java:/ConnectionFactory
EAP_HOME/bin/standalone.sh -c standalone-full.xml -Dproperty.helloworldmdb.queue=java:/queue/HELLOWORLDMDBPropQueue -Dproperty.helloworldmdb.topic=java:/topic/HELLOWORLDMDBPropTopic -Dproperty.connection.factory=java:/ConnectionFactoryCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Modifier le code pour utiliser les substitutions de propriétés système.
Remplacer les valeurs d'annotation@ActivationConfigPropertyet@Resourcecodées en dur par des substitutions pour les propriétés système nouvellement définies. Voici des exemples sur la façon de changer le guide de démarrage rapidehelloworld-mdbpour qu'il utilise les substitutions de propriétés système nouvellements définies pour les annotations qui se trouvent dans le code source.- Modifier la valeur de propriété
@ActivationConfigPropertydestinationqui se trouve dans la classeHelloWorldQueueMDBafin d'utiliser la substitution pour la propriété système. L'annotation@MessageDrivendevra ressembler à ceci :@MessageDriven(name = "HelloWorldQueueMDB", activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), @ActivationConfigProperty(propertyName = "destination", propertyValue = "${property.helloworldmdb.queue}"), @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge") })@MessageDriven(name = "HelloWorldQueueMDB", activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), @ActivationConfigProperty(propertyName = "destination", propertyValue = "${property.helloworldmdb.queue}"), @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge") })Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Modifier la valeur de propriété
@ActivationConfigPropertydestinationqui se trouve dans la classeHelloWorldTopicMDBafin d'utiliser la substitution pour la propriété système. L'annotation@MessageDrivendevra ressembler à ceci :@MessageDriven(name = "HelloWorldQTopicMDB", activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"), @ActivationConfigProperty(propertyName = "destination", propertyValue = "${property.helloworldmdb.topic}"), @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge") })@MessageDriven(name = "HelloWorldQTopicMDB", activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"), @ActivationConfigProperty(propertyName = "destination", propertyValue = "${property.helloworldmdb.topic}"), @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge") })Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Modifier les annotations
@Resourcequi se trouvent dans la classeHelloWorldMDBServletClientafin d'utiliser les substitutions de propriétés système. Le code devra ressembler à ceci :Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Modifier le fichier
hornetq-jms.xmlpour pouvoir utiliser les valeurs de substitution de propriétés système.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- Déployer l'application. L'application utilisera maintenant les valeurs indiquées par les propriétés système comme valeurs de propriété pour
@Resourceet@ActivationConfigProperty.
7.5. Invoquer les Session Beans Copier lienLien copié sur presse-papiers!
7.5.1. Invoquer un session bean à distance avec JNDI Copier lienLien copié sur presse-papiers!
ejb-remote contient des projets Maven qui démontrent cette fonctionnalité. Le Quickstart contient des projets à la fois pour le déploiement des session beans et pour le client distant. Les exemples de code ci-dessous sont extraits du projet du client distant.
Avertissement
Conditions préalables
- Vous devez déjà avoir un projet Maven créé, prêt à l'utilisation.
- La configuration du référentiel JBoss EAP 6 Maven a déjà été ajoutée.
- Les session beans que vous souhaitez invoquer sont déjà déployés.
- Les session beans déployés implémentent les interfaces commerciales éloignées.
- Les interfaces commerciales éloignées des beans de session sont disponibles sous forme de dépendances de Maven. Si les interfaces commerciales éloignées ne sont disponibles que sous forme de fichier JAR, alors il est recommandé d'ajouter le JAR à votre référentiel Maven comme un artefact. Reportez-vous à la documentation de Maven pour obtenir des directives
install:install-file, http://maven.apache.org/plugins/maven-install-plugin/usage.html - Vous aurez besoin de connaître le nom d'hôte et le port JNDI du serveur qui hébergent les session beans.
Procédure 7.8. Ajouter une configuration de projet Maven pour l'invocation à distance des session beans
Ajouter les dépendances de projet utiles
Lepom.xmldu projet doit être mis à jour pour pouvoir inclure les dépendances nécessaires.Ajouter le fichier
jboss-ejb-client.propertiesL'API du client JBoss EJB s'attend à trouver un fichier dans la racine du projet nomméjboss-ejb-client.propertiesqui contient les informations de connexion aux services JNDI. Ajouter ce fichier au répertoiresrc/main/resources/de votre projet avec le contenu suivant.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Changer le nom d'hôte et le port pour qu'ils correspondent au serveur.4447est le numéro de port par défaut. Pour une connexion sécurisée, définir la ligneSSL_ENABLEDàtrueet dé-commenter la ligneSSL_STARTTLS. L'interface éloignée du conteneur supporte les connexions sécurisées et non sécurisées en utilisant le même port.Ajouter des dépendances aux interfaces commerciales à distance.
Ajouter les dépendances Maven aupom.xmlaux interfaces commerciales éloignées des session beans.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Procédure 7.9. Obtenez un Bean Proxy par JNDI et invoquez les méthodes du Bean
Exceptions vérifiées par Handle
Deux des méthodes utilisées dans le code suivant (InitialContext()etlookup()) ont une exception vérifiée du typejavax.naming.NamingException. Ces appels de méthode doivent soit être contenus dans un bloc try/catch qui intercepteNamingExceptionou dans une méthode déclarée pour lancerNamingException. Le Quickstartejb-remoteutilise la seconde technique.Créer un contexte JNDI
Un objet de contexte JNDI fournit le mécanisme pour demander les ressources dans le serveur. Créer un contexte JNDI avec le code suivant :final Hashtable jndiProperties = new Hashtable(); jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); final Context context = new InitialContext(jndiProperties);
final Hashtable jndiProperties = new Hashtable(); jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); final Context context = new InitialContext(jndiProperties);Copy to Clipboard Copied! Toggle word wrap Toggle overflow Les propriétés de connexion du service JNDI sont lues à partir du fichierjboss-ejb-client.properties.Utiliser la méthode JNDI Context's lookup() pour obtenir un Bean Proxy
Invoquer le méthodelookup()du bean proxy et lui faire passer le nom JNDI du session bean dont vous avez besoin. Un objet sera renvoyé et il devra correspondre au type de méthode d'interface commerciale qui contient les méthodes que vous souhaitez invoquer.final RemoteCalculator statelessRemoteCalculator = (RemoteCalculator) context.lookup( "ejb:/jboss-ejb-remote-server-side//CalculatorBean!" + RemoteCalculator.class.getName());final RemoteCalculator statelessRemoteCalculator = (RemoteCalculator) context.lookup( "ejb:/jboss-ejb-remote-server-side//CalculatorBean!" + RemoteCalculator.class.getName());Copy to Clipboard Copied! Toggle word wrap Toggle overflow Les noms de session bean JNDI sont définis par une syntaxe particulière. Pour plus d'informations, consulter Section 7.8.1, « Référence de nommage EJB JNDI » .Méthodes d'invocation
Maintenant que vous avez un objet bean proxy, vous pouvez invoquer n'importe quelle méthode qui contienne l'interface commerciale distante.int a = 204; int b = 340; System.out.println("Adding " + a + " and " + b + " via the remote stateless calculator deployed on the server"); int sum = statelessRemoteCalculator.add(a, b); System.out.println("Remote calculator returned sum = " + sum);int a = 204; int b = 340; System.out.println("Adding " + a + " and " + b + " via the remote stateless calculator deployed on the server"); int sum = statelessRemoteCalculator.add(a, b); System.out.println("Remote calculator returned sum = " + sum);Copy to Clipboard Copied! Toggle word wrap Toggle overflow Le proxy bean transmet la demande d'invocation de méthode au bean de session sur le serveur, où elle est exécutée. Le résultat est retourné au proxy bean qui, ensuite, le retourne à l'appelant. La communication entre le proxy bean et le bean de session distant est transparente à l'appelant.
7.5.2. Contextes Client EJB Copier lienLien copié sur presse-papiers!
- Un client à distance, exécuté comme application Java autonome.
- Un client à distance, exécuté dans une autre instance de JBoss EAP 6.
7.5.3. Considérations lors de l'utilisation d'un Contexte EJB Unique Copier lienLien copié sur presse-papiers!
Vous devez considérer les conditions préalables de votre application lors de l'utilisation d'un contexte client EJB unique avec des clients à distance autonomes. Pour plus d'informations sur les différents types de clients à distance, veuillez consulter : Section 7.5.2, « Contextes Client EJB » .
Un client autonome à distance possède généralement un seul contexte client EJB sauvegardé par n'importe quel nombre de récepteurs EJB. Voici un exemple d'application client à distance autonome :
jboss-ejb-client.properties utilisé pour installer le contexte client EJB et les récepteurs EJB. Cette configuration comprend également les informations de sécurité, qui sont ensuite utilisées pour créer le récepteur EJB qui relie le serveur JBoss EAP 6. Quand le code ci-dessus est invoqué, l'API client EJB recherche le contexte client EJB, ensuite utilisé pour sélectionner le récepteur EJB qui recevra et traitera la requête d'invocation EJB. Dans ce cas, il n'y a que le contexte client EJB unique, donc ce contexte sera utilisé par le code ci-dessus pour invoquer le bean. La procédure pour invoquer un bean de session à distance en utilisant JNDI est décrite plus en détails ici : Section 7.5.1, « Invoquer un session bean à distance avec JNDI » .
Une application d'utilisateur pourrait vouloir invoquer un bean plus d'une fois, mais se connecter au serveur JBoss EAp 6 en utilisant différentes informations de sécurité. Voici un exemple d'une application client à distance autonome qui invoque deux fois le même bean :
Les contextes client EJB scoped offrent une solution à ce problème. Ils offrent un plus grand contrôle sur les contextes client EJB et leurs contextes JNDI associés, qui sont généralement utilisés pour les invocations EJB. Pour plus d'informations sur les contextes client EJB scoped, veuillez consulter Section 7.5.4, « Utiliser des Contextes Client EJB scoped » et Section 7.5.5, « Configurer les EJB en utilisant un contexte client EJB scoped » .
7.5.4. Utiliser des Contextes Client EJB scoped Copier lienLien copié sur presse-papiers!
Pour invoquer un EJB dans les versions antérieures de JBoss EAP 6, il faut généralement créer un contexte JNDI et lui passer le PROVIDER_URL, qui indique le serveur de cible. Toute invocation faite sur les proxys EJB recherchés en utilisant ce contexte JNDI finiraient sur ce serveur. Dans les contextes client EJB scoped, les applications utilisateur contrôlent quel récepteur EJB est utilisé pour une invocation spécifique.
Avant l'introduction des contextes client EJB étendus, le contexte était généralement étendu à l'application client. Les contextes client étendus autorisent maintenant les contextes client EJB à être étendus avec les contextes JNDI. Voici un exemple d'une application client autonome à distance qui invoque le même bean deux fois en utilisant un contexte client EJB scoped.
jboss-ejb-client.properties. Pour étendre le contexte client EJB au contexte JNDI, il faut également indiquer la propriété org.jboss.ejb.client.scoped.context et définir sa valeur sur true. Cette propriété notifie à l'API client EJB qu'il doit créer un contexte client EJB, sauvegardé par des récepteurs EJB, et que le contexte créé doit ensuite être étendu ou visible uniquement au contexte JNDI qui l'a créé. Tout proxy EJB recherché ou invoqué en utilisant ce contexte JNDI ne connaîtra que le contexte client EJB associé à ce contexte JNDI. Les autres contextes JNDI utilisés par l'application pour rechercher ou invoquer des EJB ne reconnaîtra pas les autres contextes client EJB scoped.
org.jboss.ejb.client.scoped.context et ne sont pas étendus vers un contexte client EJB, utiliseront le comportement par défaut, qui utilise le contexte client EJB existant normalement attaché à l'application dans sa totalité.
Note
InitialContext lorsqu'il n'est plus utile. Lorsque l'InitialContext est fermé, les ressources sont libérées immédiatement. Les proxys qui y sont liés ne sont plus valides et tout invocation soulèvera une exception. Une mauvaise fermeture du InitialContext peut entraîner les problèmes de ressource ou de performance.
7.5.5. Configurer les EJB en utilisant un contexte client EJB scoped Copier lienLien copié sur presse-papiers!
Les EJB peuvent être configurés en utilisant un contexte scoped basé mappe. Cela est possible en complétant une mappe Properties par programmation en utilisant les propriétés standards trouvées dans jboss-ejb-client.properties, en indiquant true pour la propriété org.jboss.ejb.client.scoped.context, et en passant les propriétés sur la création InitialContext.
Procédure 7.10. Configurer un EJB en utilisant un contexte scoped basé mappage
Configurer les propriétés
Configurer les propriétés client EJB par programmation, en indiquant le même ensemble de propriétés utilisées dans le fichierjboss-ejb-client.propertiesstandard. Pour activer le contexte scoped, vous devez indiquer la propriétéorg.jboss.ejb.client.scoped.contextet configurer sa valeur surtrue. Voici un exemple de configuration des propriétés par programmation :Copy to Clipboard Copied! Toggle word wrap Toggle overflow Passer les propriétés en création de contexte
// Create the context using the configured properties InitialContext ic = new InitialContext(ejbClientContextProps); MySLSB bean = ic.lookup("ejb:myapp/ejb//MySLSBBean!" + MySLSB.class.getName());// Create the context using the configured properties InitialContext ic = new InitialContext(ejbClientContextProps); MySLSB bean = ic.lookup("ejb:myapp/ejb//MySLSBBean!" + MySLSB.class.getName());Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- Les contextes générés par les proxys EJB de recherche sont liés par ce contexte étendu et n'utilisent que les paramètres de connexion appropriés. Cela permet de créer différents contextes pour accéder aux données au sein d'une application client ou pour accéder aux serveurs de manière indépendante en utilisant différents logins.
- Dans le client, le
InitialContextétendu et le proxy étendu sont tous les deux transférés vers les threads, permettant à chaque thread de fonctionner avec le contexte donné. Il est également possible de transférer le proxy vers des threads multiples qui peuvent l'utiliser simultanément. - Le contexte étendu proxy EJB est sérialisé sur l'appel distant, puis désérialisé sur le serveur. Lorsqu'il est désérialisé, les informations de contexte étendu sont supprimées et il retourne à son état par défaut. Si le proxy désérialisé est utilisé sur le serveur distant, c-a-d s'il n'a plus le contexte étendu utilisé lors de sa création, cela peut provoquer une erreur
EJBCLIENT000025ou éventuellement appeler une cible indésirable en utilisant le nom de l'EJB.
7.5.6. Propriétés Client EJB Copier lienLien copié sur presse-papiers!
Les tableaux suivants énumèrent les propriétés pouvant être configurées par programmation ou dans le fichier jboss-ejb-client.properties.
Le tableau suivant énumère les propriétés valides pour la bibliothèque entière au sein de la même étendue.
| Nom de propriété | Description |
|---|---|
endpoint.name |
Nom du point de terminaison du client. Si pas configuré, sa valeur par défaut sera
client-endpoint.
Cela peut s'avérer utile pour distinguer différentes configurations de point de terminaison puisque le nom de thread comprend cette propriété.
|
remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED |
Valeur booléenne qui indique si le protocole SSL est activé pour toutes les connexions.
Avertissement
Red Hat recommande que vous désactiviez explicitement SSL en faveur de TLSv1.1 ou TLSv1.2 dans tous les packages affectés.
|
deployment.node.selector |
Nom complet de l'implémentation de
org.jboss.ejb.client.DeploymentNodeSelector.
Ceci est utilisé pour équilibrer les charges de l'invocation des EJB.
|
invocation.timeout |
Délai pour la liaison EJB ou le cycle requête/réponse de l'invocation de la méthode. Valeur exprimée en millisecondes.
L'invocation de toute méthode lève une
java.util.concurrent.TimeoutException si l'exécution prend plus de temps que la période de délai. L'exécution se termine et le serveur n'est pas interrompu.
|
reconnect.tasks.timeout |
Délai des tâches de reconnexion de l'arrière-plan. Valeur exprimée en millisecondes.
Si des connexions sont éteintes, la prochaine invocation EJB de client utilisera un algorithme pour décider si une reconnexion est nécessaire pour trouver le bon nœud.
|
org.jboss.ejb.client.scoped.context |
Valeur booléenne indiquant s'il faut activer le contexte client EJB d'étendue. La valeur par défaut est
false.
Si défini comme
true, le client EJB utilisera le contexte étendu lié au contexte JNDI. Sinon, le contexte de client EJB utilisera la sélecteur global dans le JVM pour déterminer les propriétés utilisées pour appeler l'hôte et l'EJB à distance.
|
Les propriétés de connexion commencent par le préfixe remote.connection.CONNECTION_NAME où le CONNECTION_NAME est un identifiant local utilisé uniquement pour identifier la connexion de manière exclusive.
| Nom de propriété | Description |
|---|---|
remote.connections |
Liste de
connection-names actifs séparés par des virgules. Chaque connexion est configurée sous ce nom.
|
|
Nom d'hôte ou IP de cette connexion
|
|
Port de la connexion. La valeur par défaut est 4447.
|
|
Nom d'utilisateur utilisé pour authentifier la sécurité de connexion.
|
|
Mot de passe utilisé pour authentifier l'utilisateur.
|
|
Période de délai de la connexion initiale. Après cela, la tâche de reconnexion vérifiera périodiquement si la connexion peut être établie. Valeur exprimée en millisecondes.
|
|
Nom complet de la classe
CallbackHandler. Il sera utilisé pour établir la connexion et ne peut être modifié tant que la connexion est activée.
|
|
Valeur entière indiquant le nombre maximal de requêtes sortantes. La valeur par défaut est 80.
Il n'y a qu'une connexion entre le client (JVM) et le serveur pour gérer les invocations.
|
|
Valeur booléenne déterminant si les identifiants doivent être fournis par le client pour réussir la connexion. La valeur par défaut est
true.
Si défini comme
true, le client doit fournir les identifiants. Si défini comme false, l'invocation est autorisée tant que le connecteur à distance ne demande pas un domaine de sécurité.
|
|
Désactive certains mécanismes SASL utilisés pour l'authentification pendant la création de la connexion.
JBOSS-LOCAL-USER signifie que le mécanisme d'authentification silencieux, utilisé lorsque le client et serveur sont sur la même machine, est désactivé.
|
|
Valeur booléenne qui active ou désactive l'utilisation de messages de texte brut pendant l'authentification. Si JAAS est utilisé, il doit être défini comme « false » pour autoriser un mot de passe de texte brut.
|
|
Valeur booléenne indiquant si le protocole SSL est activé pour cette connexion.
Avertissement
Red Hat recommande que vous désactiviez explicitement SSL en faveur de TLSv1.1 ou TLSv1.2 dans tous les packages affectés.
|
|
Intervalle pour envoyer une pulsation entre un client et un serveur pour empêcher une fermeture automatique, par exemple dans le cas d'un pare-feu. La valeur est exprimée en millisecondes.
|
Si la connexion initiale se connecte à un environnement clusterisé, la topologie du cluster est reçue de manière automatique et asynchrone. Ces propriétés sont utilisées pour se connecter à chaque membre reçu. Chaque propriété commence avec le préfixe remote.cluster.CLUSTER_NAME où le CLUSTER_NAME se réfère à la configuration du sous-système Infinispan du serveur associé.
| Nom de propriété | Description |
|---|---|
|
Le nom complet de l'implémentation de
org.jboss.ejb.client.ClusterNodeSelector.
Cette classe, plutôt que
org.jboss.ejb.client.DeploymentNodeSelector, est utilisée pour équilibrer la charge des invocations EJB dans un environnement clusterisé. Si le cluster est complètement arrêté, l'invocation échouera avec No ejb receiver available.
|
|
Valeur entière indiquant le nombre maximal de requêtes sortantes pouvant être faites au cluster entier.
|
|
Valeur entière indiquant le nombre maximal de requêtes sortantes pouvant être faites à ce nœud de cluster spécifique.
|
7.6. Intercepteurs de conteneurs Copier lienLien copié sur presse-papiers!
7.6.1. Intercepteurs de conteneurs Copier lienLien copié sur presse-papiers!
ejb-jar.xml pour la version 3.1 du descripteur de déploiement ejb-jar.
Les intercepteurs de conteneur configurés pour un EJB sont certains d'être exécutés avant que le JBoss EAP ne fournisse des intercepteurs de sécurité, des intercepteurs de gestion de transaction ou autres intercepteurs fournis par le serveur. Cela permet aux intercepteurs de conteneurs spécifiques à l'application de traiter ou de configurer des données de contexte pertinentes avant l'invocation.
Bien que les intercepteurs de conteneur soient modélisés pour pouvoir ressembler aux intercepteurs de Java EE, il y a quelques différences dans la sémantique de l'API. Par exemple, il est illégal pour les intercepteurs de conteneur d'invoquer la méthode javax.interceptor.InvocationContext.getTarget() parce que ces intercepteurs sont invoqués bien avant que les composants EJB ne soient configurés ou instanciés.
7.6.2. Créer une classe d'intercepteur de conteneur Copier lienLien copié sur presse-papiers!
Les classes d'intercepteur de conteneur sont de simples POJO (Plain Old Java Objects). Ils utilisent @javax.annotation.AroundInvoke pour marquer la méthode qui est invoquée lors de l'invocation du bean.
iAmAround de l'invocation :
Exemple 7.2. Exemple de classe d'intercepteur de conteneur
jboss-ejb3.xml décrit ici : Section 7.6.3, « Configurer un intercepteur de conteneur ».
7.6.3. Configurer un intercepteur de conteneur Copier lienLien copié sur presse-papiers!
Les intercepteurs de conteneurs utilisent les bibliothèques d'intercepteur J2EE standard, ce qui signifie qu'ils utilisent les mêmes éléments XSD que ceux qui sont autorisés dans le fichier ejb-jar.xml pour la version 3.1 du descripteur de déploiement ejb-jar. Comme ils se reposent sur les bibliothèques standard d'interceptor Jave EE, les intercepteurs de conteneur peuvent uniquement être configurés à l'aide de descripteurs de déploiement. Cela a été conçu pour que les applications n'exigent pas une annotation spécifique de JBoss ou autre dépendance de bibliothèque. Pour plus d'informations sur les intercepteurs de conteneur, voir : Section 7.6.1, « Intercepteurs de conteneurs ».
Procédure 7.11. Créer le fichier de descripteur pour configurer l'intercepteur de conteneur
- Créer un fichier
jboss-ejb3.xmldans le répertoireMETA-INFdu déploiement EJB. - Configurer les éléments de l'intercepteur du conteneur dans le fichier du descripteur.
- Utiliser l'espace-nom
urn:container-interceptors:1.0pour indiquer la configuration des éléments de l'intercepteur du conteneur. - Utiliser l'élément
<container-interceptors>pour indiquer les intercepteurs du conteneur. - Utiliser les éléments
<interceptor-binding>pour relier l'intercepteur du conteneur aux EJB. Les intercepteurs peuvent être reliés d'une des manières suivantes :- Relier l'intercepteur à tous les EJB du déploiement par le caractère générique
*. - Relier l'intercepteur au niveau bean individuel par le nom spécifique de l'EJB.
- Relier l'intercepteur au niveau de méthode spécifique des EJB.
Note
Ces éléments sont configurés par EJB 3.1 XSD de la même façon que pour les intercepteurs Java EE.
- Vérifier les exemples d'éléments ci-dessus dans le fichier de descripteur suivant.
Exemple 7.3. jboss-ejb3.xml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow L'XSD de l'espace-nomurn:container-interceptors:1.0se trouve dansEAP_HOME/docs/schema/jboss-ejb-container-interceptors_1_0.xsd.
7.6.4. Modifier l'identité du contexte de sécurité Copier lienLien copié sur presse-papiers!
Par défaut, lorsque vous effectuez un appel distant à un EJB déployé sur le serveur d'applications, la connexion au serveur est authentifiée et toute demande reçue via cette connexion sera exécutée en tant qu'identité ayant authentifié la connexion. Cela est vrai pour les appels client-serveur et serveur-serveur. Si vous avez besoin d'utiliser différentes identités en provenance d'un même client, vous devrez normalement ouvrir des connexions multiples au serveur afin que chacune d'entre elles soient authentifiée en tant qu'identité différente. Plutôt que d'ouvrir plusieurs connexions de client, vous pouvez donner l'autorisation à l'utilisateur authentifié d'exécuter une requête sous un nom différent.
ejb-security-interceptors pour obtenir un exemple complet.
Procédure 7.12. Modifier l'identité du contexte de sécurité
Créer l'intercepteur côté client
Cet intercepteur côté client doit implémenter l'interfaceorg.jboss.ejb.client.EJBClientInterceptor. L'intercepteur doit passer l'identité requise par le mappage de données contextuelles, par l'intermédiaire d'un appelEJBClientInvocationContext.getContextData(). Voici un exemple de code d'intercepteur côté client :Copy to Clipboard Copied! Toggle word wrap Toggle overflow Les applications utilisateur peuvent insérer l'intercepteur dans la chaîne d'intercepteur dans leEJBClientContextpar l'un des moyens suivants :Par programmation
Par cette approche, vous appelez la méthodeorg.jboss.ejb.client.EJBClientContext.registerInterceptor(int order, EJBClientInterceptor interceptor)et passez l'instanceorderet l'instanceinterceptor. L'instanceorderest utilisé pour déterminer où exactement cet intercepteur est placé dans la chaîne d'intercepteur.Mécanisme ServiceLoader
Cette approche nécessite la création d'un fichierMETA-INF/services/org.jboss.ejb.client.EJBClientInterceptoret de le placer ou le mettre dans le chemin de classe de l'application client. Les règles du fichier sont dictées par le Java ServiceLoader Mechanism. Ce fichier doit contenir, dans chaque ligne distincte, le nom de classe qualifié complet de l'implémentation d'intercepteur de client EJB. Les classes d'intercepteur de client EJB doivent être disponibles dans le chemin de classe. Les intercepteurs de client EJB ajoutés en utilisant le mécanisme deServiceLoadersont ajoutés à la fin de la chaîne d'intercepteur de client, dans l'ordre dans lequel ils se trouvent dans le chemin de classe (classpath). Le démarrage rapide ou quickstartejb-security-interceptorsutilise cette approche.
Créer et configurer l'intercepteur du conteneur côté serveur
Les classes d'intercepteur de conteneur sont de simples Plain Old Java Objects (POJOs). Elles utilisent@javax.annotation.AroundInvokepour marquer la méthode qui sera invoquée lors de l'invocation sur le bean. Pour plus d'informations sur les intercepteurs de conteneur, consulter : Section 7.6.1, « Intercepteurs de conteneurs ».Créer l'intercepteur de conteneur
Cet intercepteur reçoit leInvocationContexten même temps que l'identité et demande le changement d'identité nouvelle. Ce qui suit est une version modifiée de l'exemple de code :Copy to Clipboard Copied! Toggle word wrap Toggle overflow Configurer l'intercepteur du conteneur
Pour plus d'informations sur la façon de configurer les intercepteurs de conteneurs côté serveur, consulter : Section 7.6.3, « Configurer un intercepteur de conteneur ».
Créer le JAAS LoginModule
Ce composant doit vérifier que l'utilisateur est en mesure d'exécuter les requêtes selon l'identité de la requête. Les exemples de code abrégés suivants indiquent les méthodes de login et de validation :Copy to Clipboard Copied! Toggle word wrap Toggle overflow
ejb-security-interceptors README pour obtenir des instructions complètes et des informations détaillées sur le code.
7.6.5. Sécurité supplémentaire pour l'authentification EJB Copier lienLien copié sur presse-papiers!
Par défaut, lorsque vous effectuez un appel distant à un EJB déployé sur le serveur d'applications, la connexion au serveur est authentifiée et toute demande reçue via cette connexion est exécutée en utilisant les informations d'identification qui ont authentifié la connexion. L'authentification au niveau de la connexion dépend des capacités des mécanismes sous-jacents SASL (Simple Authentication and Security Layer). Plutôt que d'écrire des mécanismes SASL personnalisés, vous pouvez ouvrir et authentifier une connexion au serveur, puis ajouter les jetons de sécurité supplémentaires avant d'appeler un EJB. Cette rubrique décrit comment passer des informations supplémentaires sur la connexion existante du client pour l'authentification de l'EJB.
Procédure 7.13. Information de sécurité pour l'authentification EJB
Créer l'intercepteur côté client
Cet intercepteur doit implémenterorg.jboss.ejb.client.EJBClientInterceptor. L'intercepteur doit passer le token de sécurité supplémentaire par le mappage de données contextuelles, par l'intermédiaire d'un appelEJBClientInvocationContext.getContextData(). Voici un exemple de code d'intercepteur côté client qui crée un token de sécurité supplémentaire :Copy to Clipboard Copied! Toggle word wrap Toggle overflow Pour obtenir des informations sur la façon de connecter l'intercepteur client dans une application, voir Section 7.6.6, « Utiliser un intercepteur côté client dans une application ».Créer et configurer l'intercepteur du conteneur côté serveur
Les classes d'intercepteur de conteneur sont de simples Plain Old Java Objects (POJOs). Elles utilisent@javax.annotation.AroundInvokepour marquer la méthode qui est invoquée lors de l'invocation sur le bean. Pour plus d'informations sur les intercepteurs de conteneur, consulter : Section 7.6.1, « Intercepteurs de conteneurs ».Créer l'intercepteur de conteneur
Cet intercepteur récupère le jeton d'authentification de sécurité du contexte et le passe au domaine JAAS (Java Authentication and Autorisation Service) pour vérification. Voici un exemple de code d'intercepteur de conteneur :Copy to Clipboard Copied! Toggle word wrap Toggle overflow Configurer l'intercepteur du conteneur
Pour plus d'informations sur la façon de configurer les intercepteurs de conteneurs côté serveur, consulter : Section 7.6.3, « Configurer un intercepteur de conteneur ».
Créer le JAAS LoginModule
Ce module personnalisé exécute l'authentification à l'aide de l'information de la connexion authentifiée existante ainsi qu'à l'aide qu'un jeton de sécurité supplémentaire. Voici un exemple de code réduit qui utilise le jeton de sécurité supplémentaire et qui exécute l'authentification. On peut trouver l'exemple de code complet dans le quickstartejb-security-interceptorsfourni dans JBoss EAP 6.3 ou version supérieure.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Ajouter le LoginModule personnalisé à la chaîne
Vous devez ajouter le nouveau LoginModule personnalisé à l'endroit qui convient dans la chaîne pour qu'il soit invoqué dans le bon ordre. Dans cet exemple, leSaslPlusLoginModuledoit être mis dans la chaîne avant le LoginModule qui charge les rôles par l'optionpassword-stacking.Configurer l'ordonnancement du LoginModule par le Management CLI
Ce qui suit est un exemple de commandes de Management CLI qui enchaînent leSaslPlusLoginModulepersonnalisé avant que le LoginModuleRealmDirectdéfinisse l'optionpassword-stacking.Pour plus d'informations sur le Management CLI, voir le chapitre intitulé Management Interfaces du guide Administration and Configuration Guide de JBoss EAP 6 qui se trouve sur le portail clients https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform//subsystem=security/security-domain=quickstart-domain:add(cache-type=default) /subsystem=security/security-domain=quickstart-domain/authentication=classic:add /subsystem=security/security-domain=quickstart-domain/authentication=classic/login-module=DelegationLoginModule:add(code=org.jboss.as.quickstarts.ejb_security_plus.SaslPlusLoginModule,flag=optional,module-options={password-stacking=useFirstPass}) /subsystem=security/security-domain=quickstart-domain/authentication=classic/login-module=RealmDirect:add(code=RealmDirect,flag=required,module-options={password-stacking=useFirstPass})/subsystem=security/security-domain=quickstart-domain:add(cache-type=default) /subsystem=security/security-domain=quickstart-domain/authentication=classic:add /subsystem=security/security-domain=quickstart-domain/authentication=classic/login-module=DelegationLoginModule:add(code=org.jboss.as.quickstarts.ejb_security_plus.SaslPlusLoginModule,flag=optional,module-options={password-stacking=useFirstPass}) /subsystem=security/security-domain=quickstart-domain/authentication=classic/login-module=RealmDirect:add(code=RealmDirect,flag=required,module-options={password-stacking=useFirstPass})Copy to Clipboard Copied! Toggle word wrap Toggle overflow Configurer l'ordonnancement du LoginModule manuellement
Ce qui suit est un exemple de XML qui configure l'ordonnancement du LoginModule dans le sous-système desecuritydu fichier de configuration du serveur. LeSaslPlusLoginModuledoit précéder le LoginModuleRealmDirectpour qu'il puisse vérifier l'utilisateur distant avant que les rôles utilisateurs ne soient chargés et l'optionpassword-stackingdéfinie.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Créer le client distant
Dans l'exemple de code suivant, on assume que le fichieradditional-secret.propertiesauquel accède le JAAS LoginModule ci-dessus contient la propriété suivante :quickstartUser=7f5cc521-5061-4a5b-b814-bdc37f021acc
quickstartUser=7f5cc521-5061-4a5b-b814-bdc37f021accCopy to Clipboard Copied! Toggle word wrap Toggle overflow Le code suivant montre comment créer un token de sécurité et comment le définir avant l'appel EJB. Le token secret est codé en dur dans des buts de démonstration uniquement. Ce client se contente d'afficher les résultats sur la console.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.6.6. Utiliser un intercepteur côté client dans une application Copier lienLien copié sur presse-papiers!
Vous pouvez connecter un intercepteur côté client dans une application par programmation ou en utilisant un mécanisme ServiceLoader. La procédure suivante décrit les deux méthodes.
Procédure 7.14. Connecter l'intercepteur
Par programmation
Par cette approche, vous appelez l'APIorg.jboss.ejb.client.EJBClientContext.registerInterceptor(int order, EJBClientInterceptor interceptor)et passez l'instanceorderet l'instanceinterceptor. L'instanceorderest utilisée pour déterminer où exactement cetinterceptorest placé dans la chaîne d'intercepteur du client.Mécanisme ServiceLoader
Cette approche nécessite la création d'un fichierMETA-INF/services/org.jboss.ejb.client.EJBClientInterceptoret le placer ou le mettre dans le chemin de classe de l'application client. Les règles du fichier sont dictées par le Java ServiceLoader Mechanism. Ce fichier devrait contenir, dans chaque ligne distincte, le nom de classe qualifié complet de l'implémentation d'intercepteur de client EJB. Les classes d'intercepteur de client EJB doivent être disponibles dans le chemin de classe. Les intercepteurs de client EJB ajoutés en utilisant le mécanisme deServiceLoadersont ajoutés à la fin de la chaîne d'intercepteur de client, dans l'ordre dans lequel ils se trouvent dans le chemin de classe (classpath). Le démarrage rapide ou quickstartejb-security-interceptorsutilise cette approche.
7.7. JavaBeans Enterprise clusterisés Copier lienLien copié sur presse-papiers!
7.7.1. JavaBeans clusterisées (EJB) Copier lienLien copié sur presse-papiers!
Note
7.7.2. Configuration de client EJB In-server ou Autonome Copier lienLien copié sur presse-papiers!
jboss-ejb-client.properties pour un client EJB autonome, ou même le fichier jboss-ejb-client.xml pour une application côté serveur doit être étendue pour inclure une configuration de cluster.
jboss-ejb-client.xml) montre la configuration complète :
Exemple 7.4. Client autonome avec configuration jboss-ejb-client.properties
jboss-ejb-client.xml et ajouter la configuration de cluster comme illustré dans l'exemple suivant :
Exemple 7.5. Application client déployée dans une autre instance EAP 6 (Configurer le fichier jboss-ejb-client.xml)
Note
7.7.3. Mettre en place une politique d'équilibrage des charges presonnalisée pour les appels EJB Copier lienLien copié sur presse-papiers!
AllClusterNodeSelector pour les appels EJB calls. Le comportement de sélection de noeud de AllClusterNodeSelector ressemble à celui du sélecteur par défaut, sauf que AllClusterNodeSelector utilise tous les noeuds de cluster disponibles même pour les clusters de grande taille (nombre de noeuds>20). Si un noeud de cluster non connecté est renvoyé, il s'ouvre automatiquement. L'exemple suivant montre une implémentation de AllClusterNodeSelector :
SimpleLoadFactorNodeSelector pour les appels EJB. L'équilibrage des charges dans SimpleLoadFactorNodeSelector a lieu sur la base d'un facteur de charge. Le facteur de charge (2/3/4) est calculé sur la base des noms de noeuds (A/B/C) irrespectivement de la charge qui pèse sur chaque noeud. L'exemple suivant vous montre une implémentation de SimpleLoadFactorNodeSelector :
jboss-ejb-client.properties
Vous devrez ajouter la propriété remote.cluster.ejb.clusternode.selector au nom de votre classe d'implémentation (AllClusterNodeSelector ou SimpleLoadFactorNodeSelector). Le sélecteur vérifiera les serveurs configurés disponibles au moment de l'invocation. l'exemple suivant utilise AllClusterNodeSelector comme sélecteur de noeud de déploiement :
Vous devrez ajouter la propriété remote.cluster.ejb.clusternode.selector à la liste de constructeur PropertiesBasedEJBClientConfiguration. L'exemple suivant utilise AllClusterNodeSelector comme sélecteur de noeud de déploiement :
jboss-ejb-client.xml
Pour pouvoir utiliser la politique d'équilibrage des charges pour la communication d'un serveur à un autre, empaquetez la classe avec l'application et configurez-la dans les paramètres de jboss-ejb-client.xml (qui se trouvent dans le dossier META-INF). L'exemple suivant utilise AllClusterNodeSelector comme sélecteur de noeud de déploiement :
ejb-security-realm-1 à la configuration côté serveur. L'exemple suivant vous montre les commandes CLI pour ajouter un domaine de sécurité (ejb-security-realm-1). La valeur correspond au mot de passe base64 codifié pour l'utilisateur "test" :
core-service=management/security-realm=ejb-security-realm-1:add() core-service=management/security-realm=ejb-security-realm-1/server-identity=secret:add(value=cXVpY2sxMjMr)
core-service=management/security-realm=ejb-security-realm-1:add()
core-service=management/security-realm=ejb-security-realm-1/server-identity=secret:add(value=cXVpY2sxMjMr)
Note
-Djboss.node.name= ou le fichier de configuration du serveur standalone.xml pour configurer le nom du serveur (server name=""). Veillez à ce que le nom de serveur soit unique. En mode de domaine, le contrôleur valide automatiquement le fait que les noms soient uniques.
7.7.4. Comportement de transaction des invocations EJB Copier lienLien copié sur presse-papiers!
Les attributs de transaction d'applications distribuées EAP doivent être gérés comme si l'application était appelée sur le même serveur. Pour mettre fin à une transaction, la méthode de destination doit comporter la mention REQUIRES_NEW, à l'aide d'interfaces différentes.
Note
Pour invoquer les beans de session EJB avec un client EAP 6 autonome, le client doit avoir une référence à l'objet InitialContext tandis que les proxies EJB ou UserTransaction sont utilisés. Il est également important de garder l'objet InitialContext ouvert tant que les proxies EJB ou UserTransaction sont utilisés. Le contrôle des connexions se fera à l'intérieur des classes créées par InitialContext avec les propriétés.
InitialContext :
Note
UserTransaction sur un client n'est pas prise en charge pour les scénarios de contextes client EJB scoped et pour les invocations qui utilisent le protocole remote-naming. C'est parce que dans ces scénarios, InitialContext encapsule sa propre instance de contexte client, à laquelle on ne peut pas accéder par les méthodes statiques de la classe EJBClient. Quand la méthode EJBClient.getUserTransaction() est invoquée, elle renvoie une transaction en provenance du contexte client EJB (global) par défaut (pas forcément initialisé) et non pas en provenance du contexte souhaité.
L'exemple suivant vous montre comment obtenir une référence UserTransaction sur un client autonome :
Note
UserTransaction côté client, démarrer votre serveur avec la propriété système suivante -Djboss.node.name=yourServerName et utilisez-la ensuite côté client comme suit :
tx=EJBClient.getUserTransaction("yourServerName");
tx=EJBClient.getUserTransaction("yourServerName");
UserTransaction avec un protocole de nommage à distance ou avec un scoped-context.
7.8. Référence Copier lienLien copié sur presse-papiers!
7.8.1. Référence de nommage EJB JNDI Copier lienLien copié sur presse-papiers!
ejb:<appName>/<moduleName>/<distinctName>/<beanName>!<viewClassName>?stateful
ejb:<appName>/<moduleName>/<distinctName>/<beanName>!<viewClassName>?stateful
<appName>- Si le fichier JAR du session bean a été déployé dans un EAR, alors ce se sera le nom de l'EAR. Par défaut, le nom d'un EAR correspond à son nom de fichier sans le suffixe
.ear. Le nom de l'application peut également être remplacé dans son fichierapplication.xml. Si le bean de session n'est pas déployé dans un EAR, laissez le vide. <moduleName>- Le nom du module correspond au nom du fichier dans lequel le session bean est déployé. Par défaut, le nom du fichier JAR correspond à son nom de fichier sans le suffixe
.jar. Le nom du module peut également être remplacé par leejb-jar.xmldu JAR. <distinctName>- JBoss EAP 6 permet à chaque déploiement de spécifier un nom distinct en option. Si le déploiement n'a pas de nom distinct, laissez le vide.
<beanName>- Le nom du bean est le nom de classe de la session bean à invoquer.
<viewClassName>- Le nom de classe de vue est le nom de classe complet de l'interface distante. Inclut le nom du package de l'interface.
?stateful- Le suffixe
?statefulest requis quand le nom JNDI se réfère à un bean de session stateful. Non inclus dans d'autres types de bean.
7.8.2. Résolution de référence EJB Copier lienLien copié sur presse-papiers!
@EJB et @Resource. Veuillez noter qu'XML remplace toujours les annotations, mais que les mêmes règles s'appliquent.
Règles pour les annotations @EJB
- L'annotation
@EJBpossède également un attributmappedName(). La spécification le considère comme une métadonnée spécifique au fournisseur tandis que JBoss reconnaitmappedName()en tant que nom JNDI global du EJB que vous référencez. Si vous avez indiqué unmappedName(), alors tous les autres attributs seront ignorés et ce nom JNDI global sera utilisé comme liaison. - Si vous indiquez
@EJBsans attributs définis :@EJB ProcessPayment myEjbref;
@EJB ProcessPayment myEjbref;Copy to Clipboard Copied! Toggle word wrap Toggle overflow Alors les règles suivantes vont s'appliquer :- Le jar EJB du bean de référencement est analysé pour trouver un EJB avec l'interface utilisée dans l'injection
@EJB. S'il existe plus d'un EJB qui publie la même interface commerciale, alors une exception apparaîtra. S'il n'y a qu'un seul bean dans cette interface, alors il sera utilisé. - Chercher l'EAR des EJB qui publient cette interface. S'il y a des doubles, alors il y aura une exception. Sinon le bean correspondant sera renvoyé.
- Chercher globalement dans le runtime de JBoss un EJB de cette interface. Une fois de plus, s'il y a des doubles, il y aura une exception.
@EJB.beanName()correspond à<ejb-link>. Si lebeanName()est défini, il vous faudra utiliser le même algorithme que@EJBsans attribut défini mis à partbeanName()comme une clé de la recherche. Il existe une exception à cette règle si vous utilisez la syntaxe ejb-link '#'. La syntaxe '#' vous permettra de mettre un chemin d'accès relatif dans un jar de l'EJB qui contient l'EJB de référencement. Reportez-vous à la spécification EJB 3.1 pour plus de détails.
7.8.3. Dépendances de projet pour les clients EJB distants Copier lienLien copié sur presse-papiers!
| GroupID | ArtifactID |
|---|---|
| org.jboss.spec | jboss-javaee-6.0 |
| org.jboss.as | jboss-as-ejb-client-bom |
| org.jboss.spec.javax.transaction | jboss-transaction-api_1.1_spec |
| org.jboss.spec.javax.ejb | jboss-ejb-api_3.1_spec |
| org.jboss | jboss-ejb-client |
| org.jboss.xnio | xnio-api |
| org.jboss.xnio | xnio-nio |
| org.jboss.remoting3 | jboss-remoting |
| org.jboss.sasl | jboss-sasl |
| org.jboss.marshalling | jboss-marshalling-river |
jboss-javaee-6.0 et jboss-as-ejb-client-bom, ces dépendances doivent être ajoutées à la section <dependencies> du fichier pom.xml.
jboss-javaee-6.0 et jboss-as-ejb-client-bom doivent être ajoutées à la section <dependencyManagement> du fichier pom.xml avec le scope d' import.
Note
artifactID peuvent être modifiées. Veuillez consulter le référentiel Maven pour connaître la version la plus récente.
ejb-remote/client/pom.xml dans les fichiers quickstart pour obtenir un exemple complet de configuration de dépendance pour une invocation de session bean éloignée.
7.8.4. Référence de descripteur de déploiement jboss-ejb3.xml Copier lienLien copié sur presse-papiers!
jboss-ejb3.xml est un descripteur de déploiement personnalisé pouvant être utilisé dans un JAR EJB ou des archives WAR. Dans une archive JAR EJB, il doit être situé dans le répertoire META-INF/. Dans une archive WAR, il doit être situé dans le répertoire WEB-INF/.
ejb-jar.xml, qui utilise les mêmes espace-noms et qui fournit des espace-noms supplémentaires. Les contenus de jboss-ejb3.xml sont mergés avec les contenus de ejb-jar.xml, et les items jboss-ejb3.xml ont la priorité.
jboss-ejb3.xml. Voir http://java.sun.com/xml/ns/javaee/ pour la documentation sur les espace-noms standard.
http://www.jboss.com/xml/ns/javaee.
Espace-nom de descripteur d'assemblage
<assembly-descriptor>. Ils peuvent être utilisés pour appliquer leur configuration à un simple bean, ou à tous les beans du déploiement en utilisant * comme ejb-name.
- Espace-nom de clustering :
urn:clustering:1.0 xmlns:c="urn:clustering:1.0"
xmlns:c="urn:clustering:1.0"Copy to Clipboard Copied! Toggle word wrap Toggle overflow Cela vous permet de marquer les EJB comme étant clusterisés. Il s'agit du descripteur de déploiement équivalent au@org.jboss.ejb3.annotation.Clustered.<c:clustering> <ejb-name>DDBasedClusteredSFSB</ejb-name> <c:clustered>true</c:clustered> </c:clustering>
<c:clustering> <ejb-name>DDBasedClusteredSFSB</ejb-name> <c:clustered>true</c:clustered> </c:clustering>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - L'espace-nom de sécurité (
urn:security) xmlns:s="urn:security"
xmlns:s="urn:security"Copy to Clipboard Copied! Toggle word wrap Toggle overflow Cela vous permet de définirsecurity-domainetrun-as-principalpour l'EJB.<s:security> <ejb-name>*</ejb-name> <s:security-domain>myDomain</s:security-domain> <s:run-as-principal>myPrincipal</s:run-as-principal> </s:security>
<s:security> <ejb-name>*</ejb-name> <s:security-domain>myDomain</s:security-domain> <s:run-as-principal>myPrincipal</s:run-as-principal> </s:security>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - L'espace-nom d'adaptateur de ressource :
urn:resource-adapter-binding xmlns:r="urn:resource-adapter-binding"
xmlns:r="urn:resource-adapter-binding"Copy to Clipboard Copied! Toggle word wrap Toggle overflow Cela vous permet de définir l'adaptateur de ressource d'un message-driven bean.<r:resource-adapter-binding> <ejb-name>*</ejb-name> <r:resource-adapter-name>myResourceAdapter</r:resource-adapter-name> </r:resource-adapter-binding>
<r:resource-adapter-binding> <ejb-name>*</ejb-name> <r:resource-adapter-name>myResourceAdapter</r:resource-adapter-name> </r:resource-adapter-binding>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - L'espace-nom IIOP :
urn:iiop xmlns:u="urn:iiop"
xmlns:u="urn:iiop"Copy to Clipboard Copied! Toggle word wrap Toggle overflow L'espace-nom IIOP est l'endroit où les paramètres IIOP sont configurés.- L'espace-nom du pool :
urn:ejb-pool:1.0 xmlns:p="urn:ejb-pool:1.0"
xmlns:p="urn:ejb-pool:1.0"Copy to Clipboard Copied! Toggle word wrap Toggle overflow Cela vous permet de sélectionner le pool qui est utilisé par les stateless session beans ou par les message-driven beans. Les pools sont définis dans la configuration du serveur.<p:pool> <ejb-name>*</ejb-name> <p:bean-instance-pool-ref>my-pool</p:bean-instance-pool-ref> </p:pool>
<p:pool> <ejb-name>*</ejb-name> <p:bean-instance-pool-ref>my-pool</p:bean-instance-pool-ref> </p:pool>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - L'espace-nom du cache :
urn:ejb-cache:1.0 xmlns:c="urn:ejb-cache:1.0"
xmlns:c="urn:ejb-cache:1.0"Copy to Clipboard Copied! Toggle word wrap Toggle overflow Cela vous permet de sélectionner le cache qui est utilisé par les stateful session beans inclus. Les caches sont définis dans la configuration du serveur.<c:cache> <ejb-name>*</ejb-name> <c:cache-ref>my-cache</c:cache-ref> </c:cache>
<c:cache> <ejb-name>*</ejb-name> <c:cache-ref>my-cache</c:cache-ref> </c:cache>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Exemple 7.6. Fichier exemple de jboss-ejb3.xml
Chapitre 8. Les services JBoss MBean Copier lienLien copié sur presse-papiers!
8.1. Rédiger des services JBoss MBean Copier lienLien copié sur presse-papiers!
se crée, démarre, s'arrête ou se détruit lui-même.
- Si vous souhaitez que des méthodes spécifiques soient invoquées sur votre MBean, il vous faudra déclarer ces méthodes dans votre interface MBean. Cette approche permet à votre implementation MBean d'éviter des dépendances sur les classes JBoss.
- Si vous ne vous inquiétez pas des dépendances sur les classes spécifiques à JBoss, alors vous souhaiterez sans doute que votre interface MBean prolonge l'interface
ServiceMBeanet la classeServiceMBeanSupport. La classeServiceMBeanSupportfournit des implémentations des méthodes de cycle de vie de services commecreate,startetstop. Pour un événement spécifique commestart(), vous devrez surcharger la méthodestartService()donnée par la classe ServiceMBeanSupport.
8.2. Exemple de MBean standard Copier lienLien copié sur presse-papiers!
.sar).
ConfigServiceMBean déclare des méthodes spécifiques telles que les méthodes start, getTimeout et stop pour qu'elles démarrent, mettent en attente et stoppent le MBean correctement sans utiliser de classes spécifiques à JBoss. La classe ConfigService implémente l'interface ConfigServiceMBean et de ce fait implémente les méthodes utilisées dans cette interface.
PlainThread étend la classe ServiceMBeanSupport et implémente l'interface PlainThreadMBean. PlainThread démarre un thread et utilise la méthode ConfigServiceMBean.getTimeout() pour déterminer la durée pendant laquelle le thread doit être mis en veille.
Exemple 8.1. Exemples de services MBean
jboss-service.xml montre comment la classe ConfigService est injectée dans la classe PlainThread en utilisant la balise inject. La balise inject établit une dépendance entre PlainThreadMBean et ConfigServiceMBean permettant ainsi à PlainThreadMBean d'utiliser ConfigServiceMBean aisément.
Exemple 8.2. Descripteur de service JBoss-service.xml
jboss-service.xml dans le dossier META-INF d'une archive de service (.sar).
8.3. Déployer JBoss MBean Services Copier lienLien copié sur presse-papiers!
ServiceMBeanTest.sar) en mode Domain, utliser les commandes suivantes :
[domain@localhost:9999 /] deploy ~/Desktop/ServiceMBeanTest.sar
[domain@localhost:9999 /] deploy ~/Desktop/ServiceMBeanTest.sar
[domain@localhost:9999 /] deploy ~/Desktop/ServiceMBeanTest.sar --all-server-groups
[domain@localhost:9999 /] deploy ~/Desktop/ServiceMBeanTest.sar --all-server-groups
ServiceMBeanTest.sar) en mode Standalone, utliser la commande suivante :
[standalone@localhost:9999 /] deploy ~/Desktop/ServiceMBeanTest.sar
[standalone@localhost:9999 /] deploy ~/Desktop/ServiceMBeanTest.sar
[standalone@localhost:9999 /] undeploy ServiceMBeanTest.sar
[standalone@localhost:9999 /] undeploy ServiceMBeanTest.sar
Chapitre 9. Clustering dans les applications web Copier lienLien copié sur presse-papiers!
9.1. Réplique de session Copier lienLien copié sur presse-papiers!
9.1.1. La réplique de session HTTP Copier lienLien copié sur presse-papiers!
9.1.2. Cache de session web Copier lienLien copié sur presse-papiers!
standalone-ha.xml, ou les profils de domaine gérés ha ou full-ha. Les éléments les plus couramment configurés sont le mode cache et le nombre de propriétaires de cache pour un cache distribué.
Le mode cache peut être REPL (par défaut) ou DIST.
- REPL
- Le mode
REPLreproduit tout le cache à un nœud sur deux dans le cluster. Cela constitue l'option la plus sûre, mais elle introduit aussi plus de surcharge de temps. - DIST
- Le mode
DISTest semblable au buddy mode fourni dans les exécutions précédentes. Il réduit la surcharge de temps en répartissant le cache entre le nombre de nœuds indiqués dans le paramètreowners. Ce nombre de propriétaires est défini par défaut à2.
Le paramètre owners contrôle combien de nœuds de clusters détiennent des duplicata de la session. La valeur par défaut est 2.
9.1.3. Configurer le cache de session web Copier lienLien copié sur presse-papiers!
REPL. Si vous souhaitez utiliser le mode DIST, exécutez les deux commandes suivantes dans l'interface CLI. Si vous utilisez un profil différent, changez le nom de profil dans les commandes. Si vous utilisez un serveur autonome, retirez la partie /profile=ha des commandes.
Procédure 9.1. Configurer le cache de session web
Modifier le mode cache par défaut en
DIST./profile=ha/subsystem=infinispan/cache-container=web/:write-attribute(name=default-cache,value=dist)
/profile=ha/subsystem=infinispan/cache-container=web/:write-attribute(name=default-cache,value=dist)Copy to Clipboard Copied! Toggle word wrap Toggle overflow Définir le nombre de propriétaires de cache distribué.
La commande suivante définit5propriétaires. La valeur par défaut est2./profile=ha/subsystem=infinispan/cache-container=web/distributed-cache=dist/:write-attribute(name=owners,value=5)
/profile=ha/subsystem=infinispan/cache-container=web/distributed-cache=dist/:write-attribute(name=owners,value=5)Copy to Clipboard Copied! Toggle word wrap Toggle overflow Modifier le mode cache par défaut en
REPL./profile=ha/subsystem=infinispan/cache-container=web/:write-attribute(name=default-cache,value=repl)
/profile=ha/subsystem=infinispan/cache-container=web/:write-attribute(name=default-cache,value=repl)Copy to Clipboard Copied! Toggle word wrap Toggle overflow Relancer le serveur
Après avoir modifié le mode cache du web, vous devez relancer le serveur.
Votre serveur est configuré pour une copie de session. Pour utiliser une copie de session dans vos propres applications, veuillez vous référer au sujet suivant : Section 9.1.4, « Activer la copie de session pour votre application ».
9.1.4. Activer la copie de session pour votre application Copier lienLien copié sur presse-papiers!
Pour profiter des fonctionnalités HA (High Availability) de JBoss EAP 6, configurer votre application de manière à ce qu'elle soit distribuable. Cette procédure vous montrera comment y parvenir puis vous expliquera certaines options de configuration avancées que vous pourrez utiliser.
Procédure 9.2. Rendez votre Application Distribuable
Prérequis : indiquer que votre application est distribuable
Si votre application n'apparaît pas comme distribuable, ses sessions ne seront jamais distribuées. Ajouter l'élément<distributable/>dans la balise<web-app>du fichier descriptifweb.xmlde votre application. Voici un exemple :Exemple 9.1. Configuration minimum pour une application distribuable
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Modifier le comportement de réplication par défaut si vous le souhaitez.
Si vous souhaitez changer une des valeurs qui affectent la réplique de session, vous pouvez les changer dans l'élément<replication-config>qui est un dépendant de l'élément enfant de l'élément<jboss-web>du fichierjboss-web.xmlde votre application. Pour un exemple donné, ne l'inclure que si vous souhaitez remplacer les valeurs par défaut. L'exemple suivant énumère tous les paramètres par défaut, et est suivi d'un tableau qui explique les options les plus fréquemment modifées.Exemple 9.2. Valeurs
<replication-config>par défautCopy to Clipboard Copied! Toggle word wrap Toggle overflow
|
Option
|
Description
|
|---|---|
<replication-trigger>
|
Contrôle quelles conditions doivent déclencher la réplication de données de session dans l'ensemble du cluster. Cette option est utile, quand un objet mutable (stocké comme attribut de session) est accessible à partir de la session, le conteneur n'a aucun moyen évident de savoir si l'objet a été modifié et s'il doit être reproduit, sauf si la méthode
setAttribute() est appelée directement.
Quelle que soit la configuration, vous pourrez toujours déclencher la réplication de session en appelant
setAttribute().
|
<replication-granularity>
|
Détermine la granularité des données répliquées. La valeur par défaut est
SESSION, mais peut être définie à ATTRIBUTE à la place, pour augmenter la performance dans les sessions où la plupart des attributs restent inchangés.
Note FIELD n'est pas pris en charge dans JBoss EAP 6.
|
|
Option
|
Description
|
|---|---|
<use-jk>
|
Présumons qu'un équilibreur de charge tel que
mod_cluster, mod_jk, ou mod_proxy est utilisé. La valeur par défaut est false. Si définie comme true, le conteneur examine l'ID de session associé à chaque requête et remplace la partie jvmRoute de l'ID de session s'il y a un basculement.
|
<max-unreplicated-interval>
|
Le plus grand intervalle (en secondes) à attendre après qu'on ait pu accéder à une session avant de déclencher une réplication d'un horodateur de session, même s'il est considéré comme inchangé. Cela permet aux nœuds de cluster d'être informés de l'horodateur de chaque session et aux sessions non répliquées de ne pas expirer de manière incorrecte pendant un basculement. Cela vous permet également de vous fier à une valeur correcte pour les appels à méthode
HttpSession.getLastAccessedTime() pendant un basculement.
Par défaut, aucune valeur n'est indiquée. Une valeur
0 entraîne une réplication de l'horodateur à chaque accès à la session. Une valeur -1 n'entraîne une réplication de l'horodateur que si une autre activité entraîne une réplication pendant la requête. Une valeur positive supérieure à HttpSession.getMaxInactiveInterval() est traitée comme une erreur de configuration et sera convertie à 0.
|
<snapshot-mode>
|
Indique quand les sessions sont répliquées vers d'autres nœuds. La valeur par défaut est
INSTANT et l'autre valeur possible est INTERVAL.
En mode
INSTANT, les modifications sont répliquées à la fin d'une requête, au moyen du thread de traitement des requêtes. L'option <snapshot-interval> est ignorée.
En mode
INTERVAL, une tâche d'arrière-plan s'exécute à l'intervalle indiqué par <snapshot-interval>, et réplique les sessions modifiées.
|
<snapshot-interval>
|
L'intervalle, en millisecondes, pendant lequel les sessions modifiées doivent être répliquées si elles utilisent
INTERVAL pour la valeur de <snapshot-mode>.
|
<session-notification-policy>
|
Nom complet de la classe de l'implémentation de l'interface
ClusteredSessionNotificationPolicy qui contrôle si les notifications de spécification servlet sont émises vers un HttpSessionListener, HttpSessionAttributeListener, ou HttpSessionBindingListener enregistré.
|
9.2. Passivation et activation HttpSession Copier lienLien copié sur presse-papiers!
9.2.1. La passivation et l'activation de session HTTP Copier lienLien copié sur presse-papiers!
- Quand le conteneur réclame la création d'une nouvelle session, si le nombre de sessions actives en cours dépasse une limite configurable, le serveur tentera de passiver certaines sessions pour faire place à une nouvelle session.
- De façon périodique, à un intervalle précis configuré, une tâche d'arrière-plan vérifiera si les sessions doivent être passivées.
- Quand une application web est déployée et qu'une copie de sauvegarde de sessions actives sur d'autres serveurs est acquise par le gestionnaire de session de l'application web récemment déployée, les sessions peuvent être passivées.
- La session n'a pas été utilisée pendant une durée plus longue qu'une période d'inactivité configurable maximale.
- Le nombre de sessions actives dépasse un maximum configurable et la session n'a pas été utilisée pendant une durée plus longue qu'une période d'inactivité configurable maximale.
9.2.2. Configurer la passivation HttpSession dans votre application Copier lienLien copié sur presse-papiers!
La Passivation HttpSession est configurée dans le fichier WEB_INF/jboss-web.xml ou META_INF/jboss-web.xml de votre application.
Exemple 9.3. Exemple de fichier jboss-web.xml
Éléments de configuration de passivation
<max-active-sessions>- Nombre maximal de sessions actives autorisé. Si le nombre de sessions gérées par le gestionnaire de sessions dépasse cette valeur et que la passivation est activée, ce dépassement sera passivé sur la base du
<passivation-min-idle-time>configuré. Ensuite, si le nombre de sessions actives dépasse toujours cette limite, les tentatives de création de nouvelles sessions échoueront. La valeur par défaut de-1ne définit aucune limite quant au nombre maximal de sessions actives. <passivation-config>- Cet élément contient le reste des paramètres de configuration de passivation, en tant qu'éléments enfants.
<passivation-config> Eléments enfants
<use-session-passivation>- Si oui ou non la passivation de session doit être utilisée. La valeur par défaut est
false. <passivation-min-idle-time>- La durée minimum, en secondes, pendant laquelle une session doit être inactive avant que le conteneur n'envisage de la passiver de manière à réduire le nombre de sessions actives pour être conforme à la valeur définie par les max-active-sessions. La valeur par défaut
-1empêche les sessions d'être passivée avant que le temps<passivation-max-idle-time>ne se soit écoulé. Les valeurs -1 ou supérieures sont déconseillées si<max-active-sessions>est configuré. <passivation-max-idle-time>- La durée maximum, en secondes, pendant laquelle une session peut être inactive avant que le conteneur ne tente de la passiver pour économiser de la mémoire. La passivation de ces sessions aura lieu, que le nombre de sessions actives excède
<max-active-sessions>ou pas. Cette valeur doit être inférieure à la configuration<session-timeout>dans le fichierweb.xml. La valeur par défaut-1désactive la passivation selon l'inactivité maximum.
Note
<max-active-sessions>. Le nombre de sessions répliquées à partir d'autres nœuds dépend aussi de savoir si le mode cache REPL ou DIST est désactivé. Dans le mode cache REPL, chaque session est répliquée vers chaque nœud. Dans le mode cache DIST, chaque session n'est répliquée que vers le nombre de nœuds indiqué par le paramètre owners. Voir Section 9.1.2, « Cache de session web » et Section 9.1.3, « Configurer le cache de session web » pour plus de renseignements sur la configuration des modes cache de session.
REPL, chaque nœud peut stocker 800 sessions en mémoire. Avec le mode cache DIST désactivé, et la configuration owners définie par défaut sur 2, chaque nœud stocke 200 sessions en mémoire.
9.3. Implémenter un Singleton HA Copier lienLien copié sur presse-papiers!
La procédure suivante illustre comment déployer un service qui se trouve dans un decorateur de SingletonService et qui est utilisé comme service singleton dans l'ensemble du cluster. Le service active une minuterie programmée, qui n'est lancée qu'à une seule reprise dans le cluster.
Procédure 9.3. Implémenter un Service HA Singleton
Rédiger une application de Service HA Singleton
Voici un exemple simple deServicese trouvant dans le decoratorSingletonServicedevant être déployé comme service singleton. On trouvera un exemple complet dans le quickstart decluster-ha-singletonqui est livré avec Red Hat JBoss Enterprise Application Platform 6. Ce quickstart contient toutes les instructions pour générer et déployer l'application.Créer un service.
Voici un exemple de service :Copy to Clipboard Copied! Toggle word wrap Toggle overflow Créer un activateur qui installe le
Serviceen tant que singleton clusterisé.La liste suivante est un exemple d'activateur de service qui installe leHATimerServicecomme service singleton clusterisé :Copy to Clipboard Copied! Toggle word wrap Toggle overflow Note
L'exemple de code ci-dessus utilise une classe,org.jboss.as.clustering.singleton.SingletonService, qui fait partie de l'API privée de JBoss EAP. Une API publique deviendra disponible dans la version EAP 7 et les classes privées seront obsolètes, mais ces classes seront entretenues et rendues disponibles pendant toute la durée du cycle de version EAP 6.x.Créer un fichier ServiceActivator
Créer un fichier nomméorg.jboss.msc.service.ServiceActivatordans le répertoireresources/META-INF/services/de l'application. Ajouter une ligne contenant le nom complet de la classe de Service Activator créée dans l'étape précédente.org.jboss.as.quickstarts.cluster.hasingleton.service.ejb.HATimerServiceActivator
org.jboss.as.quickstarts.cluster.hasingleton.service.ejb.HATimerServiceActivatorCopy to Clipboard Copied! Toggle word wrap Toggle overflow Créer un bean singleton qui implémente une minuterie de singleton à utiliser dans tout le cluster.
Ce bean Singleton ne doit pas avoir d'interface distante et ne doit pas référencer son interface locale à partir d'un autre EJB d'application. Cela évite une recherche client ou de la part d'un autre composant et assure un parfait contrôle du Singleton par le SingletonService.Créer une interface d'ordonnancement
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Créer le bean Singleton qui implémente la minuterie de singleton à utiliser dans tout le cluster.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Démarrez chaque instance de JBoss EAP 6 avec le clustering activé.
Pour activer le clustering dans les serveurs autonomes, démarrer chaque serveur par le profilHA, en utilisant un nom de code unique et un offset (décallage) de port pour chaque instance comme suit :- Dans Linux, on utilise la commande suivante pour démarrer les serveurs :
EAP_HOME/bin/standalone.sh --server-config=standalone-ha.xml -Djboss.node.name=UNIQUE_NODE_NAME -Djboss.socket.binding.port-offset=PORT_OFFSET
EAP_HOME/bin/standalone.sh --server-config=standalone-ha.xml -Djboss.node.name=UNIQUE_NODE_NAME -Djboss.socket.binding.port-offset=PORT_OFFSETCopy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple 9.4. Démarrage de serveurs multiples autonomes dans Linux
EAP_HOME/bin/standalone.sh --server-config=standalone-ha.xml -Djboss.node.name=node1 EAP_HOME/bin/standalone.sh --server-config=standalone-ha.xml -Djboss.node.name=node2 -Djboss.socket.binding.port-offset=100
$ EAP_HOME/bin/standalone.sh --server-config=standalone-ha.xml -Djboss.node.name=node1 $ EAP_HOME/bin/standalone.sh --server-config=standalone-ha.xml -Djboss.node.name=node2 -Djboss.socket.binding.port-offset=100Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Dans Microsoft Windows, on utilise la commande suivante pour démarrer les serveurs :
EAP_HOME\bin\standalone.bat --server-config=standalone-ha.xml -Djboss.node.name=UNIQUE_NODE_NAME -Djboss.socket.binding.port-offset=PORT_OFFSET
EAP_HOME\bin\standalone.bat --server-config=standalone-ha.xml -Djboss.node.name=UNIQUE_NODE_NAME -Djboss.socket.binding.port-offset=PORT_OFFSETCopy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple 9.5. Démarrage de serveurs multiples autonomes dans Microsoft Windows
C:> EAP_HOME\bin\standalone.bat --server-config=standalone-ha.xml -Djboss.node.name=node1 C:> EAP_HOME\bin\standalone.bat --server-config=standalone-ha.xml -Djboss.node.name=node2 -Djboss.socket.binding.port-offset=100
C:> EAP_HOME\bin\standalone.bat --server-config=standalone-ha.xml -Djboss.node.name=node1 C:> EAP_HOME\bin\standalone.bat --server-config=standalone-ha.xml -Djboss.node.name=node2 -Djboss.socket.binding.port-offset=100Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Note
Si vous ne souhaitez pas utiliser des arguments en ligne de commande, vous pouvez configurer le fichierstandalone-ha.xmlpour que chaque instance de serveur puisse se lier à une interface séparée.Déployer l'application dans les serveurs
La commande Maven suivante déploiera votre application dans un serveur autonome qui exécute sur les ports par défaut.mvn clean install jboss-as:deploy
mvn clean install jboss-as:deployCopy to Clipboard Copied! Toggle word wrap Toggle overflow Pour déployer des serveurs supplémentaires, indiquer le nom du serveur. S'il est sur un hôte différent, passez le nom d'hôte et le numéro de port dans la ligne de commande :mvn clean package jboss-as:deploy -Djboss-as.hostname=localhost -Djboss-as.port=10099
mvn clean package jboss-as:deploy -Djboss-as.hostname=localhost -Djboss-as.port=10099Copy to Clipboard Copied! Toggle word wrap Toggle overflow Voir le quickstartcluster-ha-singletonfourni dans JBoss EAP 6 pour la configuration et les détails de déploiement de Maven.
9.4. Apache mod_cluster-manager Application Copier lienLien copié sur presse-papiers!
9.4.1. L'application mod_cluster-manager Copier lienLien copié sur presse-papiers!
9.4.2. L'application mod_cluster-manager Copier lienLien copié sur presse-papiers!
Figure 9.1. La page web d'administration de mod_cluster
- [1] mod_cluster/1.2.8.Final : indique la version de la bibliothèque de mod_cluster native
- [2] ajp://192.168.122.204:8099: indique le protocole utilisé (un parmi AJP, HTTP, HTTPS), le nom d'hôte ou l'adresse IP d'un noeud de worker et le port
- [3] jboss-eap-6.3-2: indique la JVMRoute du noeud de worker.
- [4] Virtual Host 1: indique le(s) hôte(s) virtuel(s) configuré(s) sur le noeud de worker
- : il s'agit d'une option administrative qui peut être utilisée pour désactiver la création de nouvelles sessions dans un contexte particulier. Cependant, les sessions courantes ne sont pas désactivées et demeurent intactes.
- : il s'agit d'une option administrative qui peut être utilisée pour stoper la redirection de demandes de sessions au contexte. Les sessions restantes seront reprises par défaut par un autre noeud à moins que la propriété
sticky-session-forcesoit définie sur "true" - (Activer les contextes Désativer les contextes Stopper les contextes) : opérations qui peuvent être effectuées sur tout le noeud. En sélectionnant une de ces options, vous affectez tous les contextes de noeuds dans tous ses hôtes virtuels.
- [8] Load balancing group (LBGroup): la propriété
load-balancing-groupest définie dans le sous-système mod_cluster dans la configuration EAP pour regrouper tous les noeuds de worker en groupes d'équilibrage de charges personnalisés. Le groupe d'équilibrage de charge (LBGroup) est un champ informel qui donne des informations sur tous les groupes d'équilibrage de charge définis. Si ce champ n'est pas défini, alors tous les noeuds de worker sont regroupés en un seul groupe d'équilibrage de charges par défaut.Note
Il s'agit d'un champ informationnel qui ne peut donc pas être utilisé pour définir la propriétéload-balancing-group. Cette propriété doit être définie dans le sous-système mod_cluster dans la configuration EAP. - [9] Load (value) : indique la charge sur le noeud de worker. Les « load factors » ou facteurs de charge sont évalués ainsi :
-load > 0 : un facteur de charge de 1 indique une surcharge du noeud de worker, 100 indique qu'il est libre de toute charge. -load = 0 : un facteur de charge de 0 indique que le noeud de worker est en attente, c-a-d qu'aucune demande de session ne sera redirigée vers ce noeud sauf si les autres noeuds de worker ne sont pas disponibles -load = -1 : un facteur de charge de -1 indique qu'il y a une erreur dans l'état du noeud de worker. -load = -2 : un facteur de charge de -2 indique que le noeud de worker est en cours de CPing/CPong et se trouve dans un état de transition
-load > 0 : un facteur de charge de 1 indique une surcharge du noeud de worker, 100 indique qu'il est libre de toute charge. -load = 0 : un facteur de charge de 0 indique que le noeud de worker est en attente, c-a-d qu'aucune demande de session ne sera redirigée vers ce noeud sauf si les autres noeuds de worker ne sont pas disponibles -load = -1 : un facteur de charge de -1 indique qu'il y a une erreur dans l'état du noeud de worker. -load = -2 : un facteur de charge de -2 indique que le noeud de worker est en cours de CPing/CPong et se trouve dans un état de transitionCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Chapitre 10. CDI Copier lienLien copié sur presse-papiers!
10.1. CDI Copier lienLien copié sur presse-papiers!
10.1.1. CDI Copier lienLien copié sur presse-papiers!
10.1.2. CDI (Contexts and Dependency Injection) Copier lienLien copié sur presse-papiers!
10.1.3. Avantages de CDI Copier lienLien copié sur presse-papiers!
- CDI simplifie et rétrécit votre base code en remplaçant des gros morceaux de code par des annotations.
- CDI est flexible, ce qui vous permet de désactiver ou d'activer des injections et des événements, d'utiliser des autres beans, ou d'injecter des objets non-CDI facilement.
- Il est facile d'utiliser votre ancien code avec CDI. Vous n'avez qu'à y inclure un
beans.xmldans votre répertoireMETA-INF/ouWEB-INF/. Le fichier peut être vide. - CDI simplifie le packaging et les déploiements, et réduit le montant d'XML que vous aurez besoin d'ajouter à vos déploiements.
- CDI propose une gestion du cycle de vie par contexte. Vous pouvez lier des injections aux requêtes, sessions, conversations, ou contextes personnalisés.
- CDI propose une injection de dépendance type-safe, qui est plus sécurisée et facile à débogger qu'une injection basée string.
- CDI découple les intercepteurs des beans.
- CDI fournit une notification d'événements complexe.
10.1.4. Injection de dépendance de Type-safe Copier lienLien copié sur presse-papiers!
10.1.5. Relation entre Weld, Seam 2, Seam 3, et JavaServer Faces Copier lienLien copié sur presse-papiers!
10.2. Utiliser CDI Copier lienLien copié sur presse-papiers!
10.2.1. Premières étapes Copier lienLien copié sur presse-papiers!
10.2.1.1. Activer CDI Copier lienLien copié sur presse-papiers!
Le CDI (Contexts and Dependency Injection) est l'une des technologies de base de JBoss EAP 6, et est activée par défaut. Si, pour une raison ou une autre, elle était désactivée et que vous souhaitiez l'activer, veuillez suivre la procédure suivante :
Procédure 10.1. Activer le CDI dans JBoss EAP 6
Vérifier si les informations du sous-système sont dé-commentées dans le fichier de configuration.
On peut désactiver un sous-système en dé-commentant la section qui convient dans les fichiers de configurationdomain.xmloustandalone.xml, ou en supprimant la section qui convient.Pour trouver le sous-système dansEAP_HOME/domain/configuration/domain.xmlouEAP_HOME/standalone/configuration/standalone.xml, le chercher dans les strings suivants. S'il existe, il se trouve dans la section <extensions>.<extension module="org.jboss.as.weld"/>
<extension module="org.jboss.as.weld"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow La ligne suivante doit se trouver dans le profil que vous utilisez. Les profils se trouvent dans des éléments de <profile> dans la section <profiles>.<subsystem xmlns="urn:jboss:domain:weld:1.0"/>
<subsystem xmlns="urn:jboss:domain:weld:1.0"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Avant de modifier un fichier, arrêter JBoss EAP 6.
JBoss EAP 6 modifie les fichiers de configuration pendant le temps d'exécution, vous devez donc stopper le serveur avant de modifier directement les fichiers de configuration.Modifer le fichier de configuration pour restaurer le sous-système CDI.
Si le sous-système CDI est dé-commenté, supprimer les commentaires.S'il était supprimé totalement, le restaurer en ajoutant cette ligne au fichier dans une nouvelle ligne directement au dessus de la balise </extensions> :<extension module="org.jboss.as.weld"/>
<extension module="org.jboss.as.weld"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Vous devez également ajouter la ligne suivante dans le profil concerné qui se trouve dans la section <profiles>.
<subsystem xmlns="urn:jboss:domain:weld:1.0"/>
<subsystem xmlns="urn:jboss:domain:weld:1.0"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Démarrer à nouveau JBoss EAP 6.
Démarrer JBoss EAP 6 avec votre configuration mise à jour.
JBoss EAP 6 démarre avec le sous-système CDI activé.
10.2.2. Utiliser le CDI pour développer une application Copier lienLien copié sur presse-papiers!
10.2.2.1. Utiliser le CDI pour développer une application Copier lienLien copié sur presse-papiers!
Le CDI (Contexts and Dependency Injection) vous offre une très grande flexibilité pour développer des applications, réutiliser des codes, adapter votre code au déploiement ou à l'exécution et tester des unités. JBoss EAP 6 comprend Weld, l'implémentation de référence de CDI. Ces tâches vous montrent comment utiliser CDI dans vos applications Enterprise.
10.2.2.2. CDI avec le code existant Copier lienLien copié sur presse-papiers!
beans.xml dans le répertoire META-INF/ ou WEB-INF/ de votre archive. Ce fichier peut rester vide.
Procédure 10.2. Utiliser les anciens beans dans les applications CDI
Groupez vos beans dans une archive.
Groupez vos beans dans une archive JAR ou WAR.Inclure un fichier
beans.xmldans votre archive.Mettez un fichierbeans.xmldans votre répertoire d'archive JARMETA-INF/ou d'archive WARWEB-INF/. Ce fichier peut rester vide.
Vous pouvez utiliser ces beans avec CDI. Le conteneur peut créer et détruire des instances de vos beans et les associer à un contexte désigné, les injecter dans les autres beans, les utiliser dans des expressions EL, les spécialiser par des annotations de qualificateur et y ajouter des intercepteurs et des décorateurs, sans aucune modification de votre code existant. Dans certains cas, vous devrez peut-être ajouter des annotations.
10.2.2.3. Exclure les beans du processus de balayage Copier lienLien copié sur presse-papiers!
Une des caractéristiques de Weld, l'implémentation de CDI de JBoss EAP 6, est la possibilité d'exclure des classes de balayage de votre archive, d'avoir des événements de cycle de vie conteneur émis, et déployés comme beans. Cela ne fait pas partie de la spécification JSR-299.
Exemple 10.1. Exclure des packages de votre bean.
- La première exclut toutes les classes Swing.
- La seconde exclut les classes Google Web Toolkit si le Google Web Toolkit n'est pas installé.
- La troisième exclut les classes qui finissent dans la chaîne
Blether(en utilisant une expression régulière), si la propriété de système verbosity est définie commelow. - La quatrième exclut les classes JSF (Java Server Faces) si les classes Wicket sont présentes et la propriété de système viewlayer n'est pas définie.
10.2.2.4. Utiliser une injection pour étendre une implémentation Copier lienLien copié sur presse-papiers!
Vous pouvez utiliser une injection pour ajouter ou modifier une caractéristique de votre code existant. Cet exemple vous montre comment ajouter une capacité de traduction à une classe existante. La traduction est une caractéristique hypothétique et la façon dont elle est implémentée dans cet exemple est par pseudo-code, et elle est fournie à titre illustratif uniquement.
buildPhrase. La méthode buildPhrase utilise le nom d'une ville comme paramètre et crée une formule telle que "Welcome to Boston". Votre objectif est de créer une version de cette classe Welcome pouvant traduire cette formule d'accueil dans une autre langue.
Exemple 10.2. Injecter un Bean Translator dans la classe Welcome.
Translator hypothétique dans la classe Welcome. L'objet Translator peut être un bean sans état EJB ou un autre type de bean, pouvant traduire des phrases d'une langue à une autre. Ainsi, le Translator est utilisé pour traduire la formule d'accueil complète, sans avoir à modifier la classe Welcome d'origine. Le Translator est injecté avant que la méthode buildPhrase ne soit implémentée.
10.2.3. Dépendances ambigues ou non satisfaites Copier lienLien copié sur presse-papiers!
10.2.3.1. Dépendances ambigües et non-satisfaites Copier lienLien copié sur presse-papiers!
- Il résout les annotations de qualificateur sur tous les beans qui implémentent le bean d'un point d'injection.
- Il filtre les beans désactivés. Les beans désactivés sont des beans @Alternative qui ne sont pas explicitement activés.
10.2.3.2. Qualificateurs Copier lienLien copié sur presse-papiers!
Exemple 10.3. Définit les qualificateurs @Synchronous et @Asynchronous
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface Synchronous {}
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface Synchronous {}
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface Asynchronous {}
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface Asynchronous {}
Exemple 10.4. Utiliser les qualificateurs @Synchronous et @Asynchronous
10.2.3.3. Utiliser un qualificateur pour résoudre une injection ambigue. Copier lienLien copié sur presse-papiers!
Cette tâche indique une injection ambigue et la retire par un qualificateur. Pour en savoir plus sur les injections ambigues, voir Section 10.2.3.1, « Dépendances ambigües et non-satisfaites ».
Exemple 10.5. Injections ambiguës
Welcome, une qui traduit, et l'autre non. Dans cette situation, l'injection ci-dessous est ambiguë et a besoin d'être spécifiée pour que l'on puisse utiliser la classe de traduction Welcome.
Procédure 10.3. Résoudre une injection ambigue avec un qualificateur
Créer une annotation de qualificateur nommée
@Translating.@Qualifier @Retention(RUNTIME) @Target({TYPE,METHOD,FIELD,PARAMETERS}) public @interface Translating{}@Qualifier @Retention(RUNTIME) @Target({TYPE,METHOD,FIELD,PARAMETERS}) public @interface Translating{}Copy to Clipboard Copied! Toggle word wrap Toggle overflow Annoter votre classe
Welcomepar l'annotation@Translating.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Demander la classe de traduction
Welcomedans votre injection.Vous devez demander une implémentation explicitement qualifiée, qui ressemble au modèle de la méthode de fabrique. L'ambiguité se résout au point d'injection.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
TranslatingWelcome est utilisé, et il n'y a pas d'ambiguité.
10.2.4. Beans gérés Copier lienLien copié sur presse-papiers!
10.2.4.1. Les beans gérés Copier lienLien copié sur presse-papiers!
bean.
@Inject) est un bean. Cela inclut chaque JavaBean et chaque bean de session EJB. La seule exigence pour activer les services mentionnés dans les beans est qu'ils résident dans une archive (un JAR ou un module Java EE comme un WAR ou JAR EJB) qui contienne un fichier spécial marqueur : META-INF/beans.xml.
10.2.4.2. Types de Classes qui ne sont pas des Beans Copier lienLien copié sur presse-papiers!
@ManagedBean, mais en CDI cela n'est pas nécessaire. Conformément à la spécification, le conteneur CDI traite n'importe quelle classe qui remplit les conditions suivantes en tant que bean géré :
- Il s'agit d'une classe interne non-statique
- Il ne s'agit pas d'une classe concrète, ou bien elle est annotée par
@Decorator - Elle n'est pas annotée par une annotation définie par un composant EJB, ni déclarée comme classe bean EJB dans
ejb-jar.xml. - Elle n'implémente pas l'interface
javax.enterprise.inject.spi.Extension. - Elle possède, soit un constructeur sans paramètre, soit un constructeur annoté avec
@Inject.
10.2.4.3. Utiliser le CDI pour injecter un objet dans un bean Copier lienLien copié sur presse-papiers!
META-INF/beans.xml ou WEB-INF/beans.xml, chaque objet de votre déploiement peut être injecté par le CDI.
Injecter un objet dans n'importe quelle partie de bean par l'annotation
@Inject.Pour obtenir une instance de classe, dans votre bean, annotez ce champ avec@Inject.Exemple 10.6. Injecter une instance
TextTranslatordans unTranslateControllerpublic class TranslateController { @Inject TextTranslator textTranslator; ...public class TranslateController { @Inject TextTranslator textTranslator; ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow Utiliser les méthodes de l'objet injecté
Vous pouvez directement utiliser les méthodes de vos objets injectés. Partez du principe queTextTranslatorpossède une méthodetranslate.Exemple 10.7. Utiliser les méthodes de l'objet injecté
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Utiliser l'injection dans le contructeur d'un bean
Vous pouvez injecter des objets dans le constructeur d'un bean, ou bien, vous pouvez utiliser une fabrique ou un localisateur de service pour les créer.Exemple 10.8. Utiliser l'injection pour la construction d'un bean
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Utiliser l'interface
Instance(<T>)pour obtenir les instances de façon programmatique.L'interfaceInstancepeut renvoyer une instance de TextTranslator si paramétrée par le type de bean.Exemple 10.9. Obtenir une instance par programmation
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Lorsque vous injectez un objet dans un bean, toutes les méthodes et les propriétés de l'objet sont disponibles pour votre bean. Si vous injectez dans le constructeur de votre bean, les instances des objets injectés sont créés quand le constructeur de votre bean est appelé, à moins que l'injection ne fasse référence à une instance qui existe déjà. Par exemple, une nouvelle instance ne serait pas créée si vous injectiez un bean basé-session pendant la durée de la session.
10.2.5. Contextes, Scopes et Dépendances Copier lienLien copié sur presse-papiers!
10.2.5.1. Contextes et scopes Copier lienLien copié sur presse-papiers!
@RequestScoped, @SessionScoped, et @ConversationScope.
10.2.5.2. Contextes disponibles Copier lienLien copié sur presse-papiers!
| Contexte | Description |
|---|---|
| @Dependent | Le bean est lié au cycle de vie du bean qui contient la référence. |
| @ApplicationScoped | Lié au cycle de vie de l'application. |
| @RequestScoped | Lié au cycle de vie de la requête. |
| @SessionScoped | Lié au cycle de vie de la session. |
| @ConversationScoped | Lié au cycle de vie de la conversation. Le scope de la conversation correspond aux longueurs de la requête et de la session, et est contrôlé par l'application. |
| Scopes personnalisés | Si les contextes ne correspondent pas à vos besoins, vous pourrez définir des scopes personnalisés. |
10.2.6. Cycle de vie d'un bean Copier lienLien copié sur presse-papiers!
10.2.6.1. Gestion du cycle de vie d'un bean Copier lienLien copié sur presse-papiers!
Cette tâche vous montre comment sauvegarder un bean pendant la durée de vie d'une requête. Il existe plusieurs autres scopes, et vous pouvez définir vos propres scopes.
@Dependent. Cela veut dire que le cycle de vie du bean dépend du cycle de vie du bean qui contient la référence. Pour plus d'informations, voir Section 10.2.5.1, « Contextes et scopes ».
Procédure 10.4. Gestion du cycle de vie d'un bean
Annoter le bean par le scope qui correspond au scope désiré.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Quand votre bean est utilisé dans la vue JSF, il contient un état.
<h:form> <h:inputText value="#{greeter.city}"/> <h:commandButton value="Welcome visitors" action="#{greeter.welcomeVisitors}"/> </h:form><h:form> <h:inputText value="#{greeter.city}"/> <h:commandButton value="Welcome visitors" action="#{greeter.welcomeVisitors}"/> </h:form>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Votre bean est sauvegardé dans le contexte lié au scope que vous spécifiez, et dure aussi longtemps que le scope est applicable.
10.2.6.2. Utilisation d'une méthode Producer Copier lienLien copié sur presse-papiers!
Cette tâche vous montre comment utiliser les méthodes Producer pour créer un certain nombre d'objets qui ne sont pas des beans, pour l'injection.
Exemple 10.10. Utiliser une méthode Producer au lieu d'une méthode Alternative, pour permettre le polymorphisme suite au déploiement.
@Preferred dans l'exemple donné est une annotation qualifiante. Pour plus d'informations sur les qualificateurs, veuillez vous référer à : Section 10.2.3.2, « Qualificateurs ».
@Inject @Preferred PaymentStrategy paymentStrategy;
@Inject @Preferred PaymentStrategy paymentStrategy;
Exemple 10.11. Assigner un scope à une méthode Producer
@Dependent. Si vous attribuez un scope à un bean, celle-ci est destinée au contexte approprié. La méthode Producer dans cet exemple n'est appelée qu'une fois par session.
@Produces @Preferred @SessionScoped
public PaymentStrategy getPaymentStrategy() {
...
}
@Produces @Preferred @SessionScoped
public PaymentStrategy getPaymentStrategy() {
...
}
Exemple 10.12. Utiliser une injection à l'intérieur d'une méthode Producer
Note
Les méthodes Producer vous permettent d'injecter des objets non-bean et de changer votre code de façon dynamique.
10.2.7. Beans nommés et beans alternatifs Copier lienLien copié sur presse-papiers!
10.2.7.1. Named Beans Copier lienLien copié sur presse-papiers!
@Named. Nommer un bean vous permet de l'utiliser directement dans JSF (Java Server Faces).
@Named prend un paramètre optionnel, qui correspond au nom du bean. Si le paramètre est omis, le nom du bean en minuscules sera utilisé.
10.2.7.2. Utilisation des Named Beans Copier lienLien copié sur presse-papiers!
Utiliser l'annotation
@Namedpour assigner un nom à un bean.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Le nom du bean en soi est une option. Si vous l'oubliez, le bean sera nommé par rapport à son nom de classe, avec la première lettre non capitalisée. Dans l'exemple ci-dessus, le nom par défaut serait doncgreeterBean.Utiliser le bean nommé dans une vue JSF
<h:form> <h:commandButton value="Welcome visitors" action="#{greeter.welcomeVisitors}"/> </h:form><h:form> <h:commandButton value="Welcome visitors" action="#{greeter.welcomeVisitors}"/> </h:form>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Votre bean nommé correspond à une action dans le contrôle de votre vue JSF, et à un minimum de code.
10.2.7.3. Beans Alternative Copier lienLien copié sur presse-papiers!
Exemple 10.13. Définition d'alternative
beans.xml.
10.2.7.4. Remplacer une injection par une alternative Copier lienLien copié sur presse-papiers!
Les beans alternatifs vous permettent de remplacer des beans existants. On peut les concevoir comme un moyen d'ajouter une classe qui remplit le même rôle, mais qui fonctionne différemment. Ils sont désactivés par défaut. Cette tâche vous montre comment indiquer et activer une alternative.
Procédure 10.5. Remplacer une injection
TranslatingWelcome dans votre projet, mais que vous souhaitez la remplacer par une "fausse" classe TranslatingWelcome. Cela serait le cas pour un déploiement test, où le vrai bean Translator ne peut être utilisé.
Définir l'alternative.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Substituer l'alternative.
Pour activer l'implémentation de substitution, ajouter le nom complet de la classe à votre fichierMETA-INF/beans.xmlouWEB-INF/beans.xml.<beans> <alternatives> <class>com.acme.MockTranslatingWelcome</class> </alternatives> </beans><beans> <alternatives> <class>com.acme.MockTranslatingWelcome</class> </alternatives> </beans>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
L'implémentation alternative est maintenant utilisée à la place de l'implémentation d'origine.
10.2.8. Stérétypes Copier lienLien copié sur presse-papiers!
10.2.8.1. Stéréotypes Copier lienLien copié sur presse-papiers!
- scope par défaut
- un groupe de liaisons d'intercepteur
- tous les beans avec un stéréotype ont des noms EL de bean par défaut
- tous les beans avec un stéréotype sont des alternatifs
@Named, tout bean sur lequel elle se trouve a un nom de bean par défaut. Le bean peut remplacer ce nom si l'annotation @Named est directement spécifiée sur le bean. Pour plus d'informations sur les beans nommés, voir Section 10.2.7.1, « Named Beans ».
10.2.8.2. Utilisation des stéréotypes Copier lienLien copié sur presse-papiers!
Sans les stéréotypes, les annotations peuvent devenir encombrées. Cette tâche vous montre comment utiliser les stéréotypes pour réduire l'encombrement et simplifier votre code. Pour plus d'informations sur ce que sont les stéréotypes, voir Section 10.2.8.1, « Stéréotypes ».
Exemple 10.14. Encombrement d'annotation
Procédure 10.6. Définition et utilisation des stéréotypes
Définir le stéréotype
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Utilisation d'un stéréotype.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Les stéréotypes rationalisent et simplifient votre code.
10.2.9. Méthodes Observer Copier lienLien copié sur presse-papiers!
10.2.9.1. Méthodes Observer Copier lienLien copié sur presse-papiers!
10.2.9.2. Observateurs transactionnels Copier lienLien copié sur presse-papiers!
public void refreshCategoryTree(@Observes(during = AFTER_SUCCESS) CategoryUpdateEvent event) { ... }
public void refreshCategoryTree(@Observes(during = AFTER_SUCCESS) CategoryUpdateEvent event) { ... }
- IN_PROGRESS: les obervateurs sont alors invoqués immédiatement.
- AFTER_SUCCESS: les observateurs sont invoqués après la phase de transaction, mais seulement si la transaction aboutit.
- AFTER_FAILURE: les observateurs sont invoqués après la phase de transaction, mais seulement si la transaction échoue avant d'aboutir.
- AFTER_COMPLETION: les observateurs sont invoqués après la phase de complétion de la transaction.
- BEFORE_COMPLETION: les observateurs sont invoqués avant la phase de complétion de la transaction.
10.2.9.3. Appliquer et observer des événements Copier lienLien copié sur presse-papiers!
Exemple 10.15. Appliquer un événement
Exemple 10.16. Appliquer un événement par un qualificateur
Exemple 10.17. Observer un événement
@Observes.
Exemple 10.18. Oberver un événement qualifié
10.2.10. Intercepteurs Copier lienLien copié sur presse-papiers!
10.2.10.1. Les intercepteurs Copier lienLien copié sur presse-papiers!
Points d'interception
- Interception de méthodes commerciales
- Un intercepteur de méthode commeciale s'applique aux invocations de méthodes du bean par les clients du bean.
- Interception de lifecycle callback
- Un intercepteur de lifecycle callback s'applique aux invocations de lifecycle callback par le conteneur.
- Interception de méthode de timeout
- Un intercepteur de méthode de timeout s'applique aux invocations de métodes d'EJB timeout par le conteneur.
10.2.10.2. Utiliser les intercepteurs avec le CDI Copier lienLien copié sur presse-papiers!
Exemple 10.19. Intercepteurs sans le CDI
- Le bean doit indiquer l'implémentation de l'intercepteur directement.
- Chaque bean de l'application doit indiquer l'ensemble des intercepteurs dans l'ordre qui convient. Cela fait que l'ajout ou le retrait d'intercepteurs sur la base d'une application prend beaucoup de temps et comporte un risque d'erreur non négligeable.
Procédure 10.7. Utiliser les intercepteurs avec le CDI
Définir le type de liaison d'intercepteur.
@InterceptorBinding @Retention(RUNTIME) @Target({TYPE, METHOD}) public @interface Secure {}@InterceptorBinding @Retention(RUNTIME) @Target({TYPE, METHOD}) public @interface Secure {}Copy to Clipboard Copied! Toggle word wrap Toggle overflow Marquer l'implémentation de l'intercepteur.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Utiliser l'intercepteur dans votre code commercial.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Activer l'intercepteur dans votre déploiement, en l'ajoutant à votre fichier
META-INF/beans.xmlouWEB-INF/beans.xml.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Les intercepteurs sont appliqués dans l'ordre indiqué.
Le CDI simplifie votre code d'intercepteur et simplifie l'application de votre code commercial.
10.2.11. Les décorateurs Copier lienLien copié sur presse-papiers!
@Decorator. Pour invoquer un décorateur dans une application CDI, il doit être dans le fichier beans.xml.
Exemple 10.20. Exemple de décorateur
@Delegate pour obtenir une référence à l'objet décoré.
10.2.12. Extensions portables Copier lienLien copié sur presse-papiers!
- intégration par les moteurs de Business Process Management
- intégration aux frameworks de tierce partie comme Spring, Seam, GWT ou Wicket
- nouvelle technologie basée sur le modèle de programmation CDI
- En fournissant ainsi ses propres beans, intercepteurs et décorateurs au conteneur
- En injectant des dépendances dans ses propres objets en utilisant le service d'injections de dépendances
- En fournissant une implémentation de contexte pour un scope personnalisé
- En augmentant ou en remplaçant les métadonnées basées annotation par les métadonnées d'autres sources
10.2.13. Proxies Beans Copier lienLien copié sur presse-papiers!
10.2.13.1. Proxys Bean Copier lienLien copié sur presse-papiers!
Types Java ne pouvant être mis en proxy par le conteneur
- Classes ne possédant pas de constructeur non-privé sans paramètre
- Classes déclarées
finalou qui possèdent une méthodefinal - Matrices et types primitifs
10.2.13.2. Utiliser un Proxy ou une Injection Copier lienLien copié sur presse-papiers!
Un proxy est utilisé pour l'injection quand les cycles de vie des beans sont différents les uns des autres. Le proxy est une sous-classe du bean qui est créée au moment de l'exécution et qui remplace toutes les méthodes non privées de la classe de bean. Le serveur proxy transmet l'invocation sur l'instance réelle du bean.
PaymentProcessor n'est pas injectée directement dans Shop. À la place, un proxy est injecté, et quand la méthode processPayment() est appelée, le proxy cherche l'instance de bean courante PaymentProcessor et appelle la méthode processPayment() dessus.
Exemple 10.21. Injection de proxy
Chapitre 11. Java Transaction API (JTA) Copier lienLien copié sur presse-papiers!
11.1. Aperçu Copier lienLien copié sur presse-papiers!
11.1.1. Java Transactions API (JTA) Copier lienLien copié sur presse-papiers!
Ces topics vous donnent des explications de base sur l'API Java Transactions (JTA).
11.2. Concepts de transactions Copier lienLien copié sur presse-papiers!
11.2.1. Transactions Copier lienLien copié sur presse-papiers!
11.2.2. Les propriétés ACID de transactions Copier lienLien copié sur presse-papiers!
Atomicity, Consistency, Isolation, et Durability. Cette terminologie est normalement utilisée dans le contexte de bases de données ou d'opérations transactionnelles.
Définitions ACID
- Atomicité
- Pour qu'une transaction soit atomique, tous les membres de la transaction doivent prendre la même décision. Ils doivent soit tous valider, soit tous se retirer. Si l'atomicité est cassée, ce qui en résultera s'appelle un heuristic outcome..
- Homogénéité
- Homogénéité signifie que les données écrites dans la base de données doivent être valides, en terme de schéma de base de données. La base de donnée et les autres sources de données doivent toujours être dans un état consistant. Par exemple, un état inconsistant pourrait correspondre à un champ dans lequel la moitié des données sont écrites avant qu'une opération n'échoue. Dans le cas d'un état consistant, toutes les données sont écrites, et l'écriture est retirée si incomplète.
- Isolation
- Isolation signifie que les données ajoutées à l'opération doivent être verrouillées avant toute modification, pour ne pas que les processus modifient les données au delà de la portée de la transaction en question.
- Durabilité
- Durabilité signifie qu'en cas d'échec externe, après que les membres d'une transaction aient été instruits de valider, tous les membres seront disponibles pour continuer la validation de la transaction quand l'échec sera résolu. Cette défaillance est sans doute liée au matériel, logiciels, réseau, ou tout autre système impliqué.
11.2.3. Coordinateur de transactions ou Gestionnaire de transactions Copier lienLien copié sur presse-papiers!
11.2.4. Participants à une transaction Copier lienLien copié sur presse-papiers!
11.2.5. JTA (Java Transactions API) Copier lienLien copié sur presse-papiers!
11.2.6. JTS (Java Transaction Service) Copier lienLien copié sur presse-papiers!
Note
11.2.7. Sources de données XA et transactions XA Copier lienLien copié sur presse-papiers!
11.2.8. Recouvrement XA Copier lienLien copié sur presse-papiers!
11.2.9. Le protocole de validation en 2-Phases Copier lienLien copié sur presse-papiers!
Au cours de la première phase, les participants à la transaction indiquent au coordinateur de transaction s'ils sont en mesure de valider la transaction ou bien, s'ils doivent la retirer.
Dans la deuxième phase, le coordinateur de transactions prend la décision de savoir si l'opération globale doit être validée ou bien, retirée. Si l'un des participants ne peut pas valider, la transaction sera retirée. Sinon, l'opération peut être validée. Le coordinateur dirige les opérations et en notifie le coordinateur quand les décisions sont prises. À ce moment-là, la transaction est terminée.
11.2.10. Les délais d'attente des transactions Copier lienLien copié sur presse-papiers!
11.2.11. Les transactions distribuées Copier lienLien copié sur presse-papiers!
Note
11.2.12. API de portabilité ORB Copier lienLien copié sur presse-papiers!
Classes API de la portabilité ORB
com.arjuna.orbportability.orbcom.arjuna.orbportability.oa
11.2.13. Transactions imbriquées Copier lienLien copié sur presse-papiers!
Les avantages des transactions imbriquées
- Isolation des erreurs
- Si une sous-transaction s'annule, par exemple parce qu'un objet utilisé échoue, la transaction englobante ne nécessite pas d'être annulée.
- Modularité
- Si une transaction est déjà associée à un appel quand une nouvelle transaction commence, la nouvelle transaction sera imbriquée à l'intérieur. Dès lors, si vous savez qu'un objet requiert des transactions, vous pouvez les créer dans l'objet. Si les méthodes de l'objet sont invoquées sans une transaction client, alors les transactions de l'objet sont de niveau supérieur. Sinon, elles sont imbriquées dans l'étendue des transactions du client. De la même manière, un client n'a pas besoin de savoir si un objet est transactionnel. Il peut commencer sa propre transaction.
11.3. Optimisations de transactions Copier lienLien copié sur presse-papiers!
11.3.1. Optimisations de transactions Copier lienLien copié sur presse-papiers!
Le sous-système de transactions de JBoss EAP 6 inclut plusieurs optimisations dont vous pouvez tirer avantage dans vos applications.
11.3.2. Optimisation LRCO pour une validation en 1 phase (1 PC) Copier lienLien copié sur presse-papiers!
11.3.2.1. Commit Markable Resource (CRM) Copier lienLien copié sur presse-papiers!
La configuration de l'accès à un gestionnaire de ressources via l'interface CRM de validation de ressources marquables (Commit Markable Resource) garantit que le gestionnaire de ressources 1PC puisse être inscrit dans une transaction 2PC. C'est une implémentation de l'algorithme LRCO, qui rend les ressources non-XA entièrement récupérables.
- Préparer 2PC
- Valider LRCO
- Write tx log
- Commit 2PC
Une transaction peut ne contenir qu'une ressource CMR.
Vous devez avoir un tableau créé pour lequel le SQL suivant fonctionne :
SELECT xid,actionuid FROM _tableName_ WHERE transactionManagerID IN (String[]) DELETE FROM _tableName_ WHERE xid IN (byte[[]]) INSERT INTO _tableName_ (xid, transactionManagerID, actionuid) VALUES (byte[],String,byte[])
SELECT xid,actionuid FROM _tableName_ WHERE transactionManagerID IN (String[])
DELETE FROM _tableName_ WHERE xid IN (byte[[]])
INSERT INTO _tableName_ (xid, transactionManagerID, actionuid) VALUES (byte[],String,byte[])
Exemple 11.1. Voici quelques exemples de requêtes SQL
CREATE TABLE xids (xid varbinary(144), transactionManagerID varchar(64), actionuid varbinary(28))
CREATE TABLE xids (xid varbinary(144), transactionManagerID varchar(64), actionuid varbinary(28))
CREATE TABLE xids (xid RAW(144), transactionManagerID varchar(64), actionuid RAW(28)) CREATE UNIQUE INDEX index_xid ON xids (xid)
CREATE TABLE xids (xid RAW(144), transactionManagerID varchar(64), actionuid RAW(28))
CREATE UNIQUE INDEX index_xid ON xids (xid)
CREATE TABLE xids (xid VARCHAR(255) for bit data not null, transactionManagerID varchar(64), actionuid VARCHAR(255) for bit data not null) CREATE UNIQUE INDEX index_xid ON xids (xid)
CREATE TABLE xids (xid VARCHAR(255) for bit data not null, transactionManagerID
varchar(64), actionuid VARCHAR(255) for bit data not null)
CREATE UNIQUE INDEX index_xid ON xids (xid)
CREATE TABLE xids (xid varbinary(144), transactionManagerID varchar(64), actionuid varbinary(28)) CREATE UNIQUE INDEX index_xid ON xids (xid)
CREATE TABLE xids (xid varbinary(144), transactionManagerID varchar(64), actionuid varbinary(28))
CREATE UNIQUE INDEX index_xid ON xids (xid)
CREATE TABLE xids (xid bytea, transactionManagerID varchar(64), actionuid bytea) CREATE UNIQUE INDEX index_xid ON xids (xid)
CREATE TABLE xids (xid bytea, transactionManagerID varchar(64), actionuid bytea)
CREATE UNIQUE INDEX index_xid ON xids (xid)
Par défaut, la fonctionnalité CMR est désactivée pour les sources de données. Pour l'activer, vous devez créer ou modifier la configuration de source de données et vous assurer que l'attribut connectable est défini sur true. Voici un exemple d'entrée de configuration de la section sources de données d'un fichier de configuration xml serveur :
<datasource enabled="true" jndi-name="java:jboss/datasources/ConnectableDS" pool-name="ConnectableDS" jta="true" use-java-context="true" spy="false" use-ccm="true" connectable="true"/>
<datasource enabled="true" jndi-name="java:jboss/datasources/ConnectableDS" pool-name="ConnectableDS" jta="true" use-java-context="true" spy="false" use-ccm="true" connectable="true"/>
Note
/subsystem=datasources/data-source=ConnectableDS:add(enabled="true", jndi-name="java:jboss/datasources/ConnectableDS", jta="true", use-java-context="true", spy="false", use-ccm="true", connectable="true", connection-url="validConnectionURL", driver-name="h2")
/subsystem=datasources/data-source=ConnectableDS:add(enabled="true", jndi-name="java:jboss/datasources/ConnectableDS", jta="true", use-java-context="true", spy="false", use-ccm="true", connectable="true", connection-url="validConnectionURL", driver-name="h2")
Si vous ne devez mettre à jour qu'une seule ressource existante pour utiliser la nouvelle fonctionnalité CMR, il vous suffira de modifier l'attribut connectable :
/subsystem=datasources/data-source=ConnectableDS:write-attribute(name=connectable,value=true)
/subsystem=datasources/data-source=ConnectableDS:write-attribute(name=connectable,value=true)
Le sous-système de transactions identifie les sources de données qui peuvent utiliser la fonctionnalité CMR par l'intermédiaire d'une entrée dans la section de config du sous-système de transaction comme dans l'exemple ci-dessous :
Note
11.3.3. Optimisation Presumed-Abort Copier lienLien copié sur presse-papiers!
11.3.4. Optimisation Lecture-seule Copier lienLien copié sur presse-papiers!
11.4. Résultats de transactions Copier lienLien copié sur presse-papiers!
11.4.1. Résultats de transactions Copier lienLien copié sur presse-papiers!
- Roll-back
- Si un participant à une transaction ne peut pas effectuer une validation, ou si le coordinateur de transactions ne peut pas indiquer aux participants de valider, la transaction sera annulée. Voir Section 11.4.3, « Transactions Roll-Back » pour plus d'informations.
- Valider
- Si chaque participant à une transaction peut valider, le coordinateur de transactions leur indique comment procéder, Voir Section 11.4.2, « Transactions de validation » pour plus d'informations.
- Résultat heuristique
- Si certains participants à une transaction valident, et que d'autres annulent, on parle de résultat heuristique. Les résultats heuristiques dérivent d'interventions humaines. Voir Section 11.4.4, « Résultats heuristiques » pour plus d'informations.
11.4.2. Transactions de validation Copier lienLien copié sur presse-papiers!
11.4.3. Transactions Roll-Back Copier lienLien copié sur presse-papiers!
11.4.4. Résultats heuristiques Copier lienLien copié sur presse-papiers!
- Rollback heuristique
- L'opération de validation a échoué car certains ou tous les participants ont abandonné la transaction.
- Validation heuristique
- Une opération de tentative de restauration a échoué, car tous les participants ont validé unilatéralement. Cela peut se produire si, par exemple, le coordinateur est en mesure de préparer correctement la transaction, mais décide alors de l'annuler en raison d'une défaillance de son côté, comme un oubli de mettre à jour son journal. Dans l'intervalle, les participants peuvent décider de valider.
- Mixed heuristiques
- Certains participants ont validé et d'autres ont abandonné
- Danger heuristique
- Le résultat de certaines mises à jour est inconnu. Pour les connues, ils ont soit tous été validés ou été annulés.
11.4.5. Erreurs et exceptions pour les transactions JBoss Copier lienLien copié sur presse-papiers!
UserTransaction, voir la spécification UserTransaction API dans http://docs.oracle.com/javaee/6/api/javax/transaction/UserTransaction.html.
11.5. Aperçu sur les transactions JTA Copier lienLien copié sur presse-papiers!
11.5.1. JTA (Java Transactions API) Copier lienLien copié sur presse-papiers!
11.5.2. Cycle de vie d'une transaction JTA Copier lienLien copié sur presse-papiers!
Votre application démarre une nouvelle transaction
Pour démarrer une transaction, votre application doit obtenir une instance de la classeUserTransactiondu JNDI ou bien, s'il s'agit d'un EJB, en provenance d'une annotation. L'interfaceUserTransactioncomprend des méthodes pour commencer, valider, ou annuler des transactions au plus haut niveau. Les transactions nouvellement créées sont associées automatiquement à leur thread invoquant. Les transactions imbriquées ne sont pas supportées dans JTA, donc toutes les transactions sont des transactions au plus haut niveau.En appelantUserTransaction.begin()avec des annotations démarre une transaction quand une méthode EJB est appelée (bassée sur des règles d'attributs de transaction). Toute ressource qui est utilisée après cela sera associée à la transaction. S'il y a plus plus d'une seule ressource listée, votre transaction devient une transaction XA, et participera au protocole de validation en deux temps.Note
L'objetUserTransactionest utilisé uniquement pour les transactions BMT. Dans CMT, l'objet UserTransaction n'est pas autorisé.Votre application modifie son état.
Dans l'étape suivante, votre application effectue son travail et précède aux changements d'état.Votre application décide de valider ou de s'annuler
Quand votre application a fini de changer d'état, elle décide si elle doit valider ou s'annuler. Elle appelle la méthode qui convient. Elle appelleUserTransaction.commit()ouUserTransaction.rollback().Le gestionnaire de transactions supprime la transaction des archives.
Après la validation ou l'annulation, le gestionnaire de transactions nettoie ses archives et supprime les informations du journal de transaction sur votre transaction.
Le recouvrement d'échec a lieu automatiquement. Si une ressource, un participant à une transaction, ou un serveur d'applications est disponible, le gestionnaire de transactions s'occupe du recouvrement quand l'échec sous-jacent est résolu.
11.6. Configuration de sous-système de transaction Copier lienLien copié sur presse-papiers!
11.6.1. Configuration des transactions Copier lienLien copié sur presse-papiers!
Les procédures suivantes vous montrent comment configurer le sous-système de transactions de JBoss EAP 6.
11.6.2. Configuration de source de données transactionnelle Copier lienLien copié sur presse-papiers!
11.6.2.1. Configurez votre source de données pour utiliser l'API de transaction JTA Copier lienLien copié sur presse-papiers!
Cette tâche vous montre comment activer un JTA (Java Transaction API) dans votre source de données.
Vous devez remplir les conditions suivantes avant de continuer cette tâche :
- Votre base de données ou autre ressource devra supporter un API JTA. Dans le doute, veuillez consulter la documentation.
- Créer une source de données. Veuillez vous référer à Section 11.6.2.4, « Créer une source de données non-XA avec les interfaces de gestion ».
- Stopper le serveur JBoss EAP 6
- Obtenir un accès pour pouvoir éditer les fichiers de configuration directement dans un éditeur de texte.
Procédure 11.1. Configurez la source de données pour utiliser l'API de Java Transaction
Ouvrir le fichier de configuration dans l'éditeur de texte.
Selon que vous exécutiez JBoss EAP 6 sur un domaine géré ou un serveur autonome, votre fichier de configuration ne se trouvera pas au même endroit.Domaine géré
Le fichier de configuration par défaut d'un domaine géré se trouve dansEAP_HOME/domain/configuration/domain.xmlpour Red Hat Enterprise Linux, etEAP_HOME\domain\configuration\domain.xmlpour Microsoft Windows Server.Serveur autonome
Le fichier de configuration par défaut d'un serveur autonome se trouve dansEAP_HOME/standalone/configuration/domain.xmlpour Red Hat Enterprise Linux, etEAP_HOME\standalone\configuration\domain.xmlpour Microsoft Windows Server.
Chercher la balise
<datasource>qui correspond à votre source de données.La source de données aura un attributjndi-namecorrespondant à celui que vous aviez indiqué quand vous l'avez créée. Par exemple, la source de données ExampleDS ressemble à ceci :<datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="H2DS" enabled="true" jta="true" use-java-context="true" use-ccm="true">
<datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="H2DS" enabled="true" jta="true" use-java-context="true" use-ccm="true">Copy to Clipboard Copied! Toggle word wrap Toggle overflow Définir l'attribut
jtaàtrue.Ajouter l'élément suivant au contenu de votre balise<datasource>, tel qu'il apparaît à l'étape précédente :jta="true"Sauf si vous avez un cas d'utilisation spécifique (comme par exemple, définir une source de données en lecture seule), Red Hat décourage la substitution de la valeur par défautjta=true. Ce paramètre indique que la source de données honorera l'API Java Transaction et permettra un meilleur suivi des connexions par l'implémentation JCA.Sauvegarder le fichier de configuration.
Sauvegarder le fichier de configuration et sortir de l'éditeur de texte.Démarrer JBoss EAP 6.
Relancer le serveur JBoss EAP 6.
JBoss EAP 6 démarre, et votre source de données est configurée pour utiliser l'API de transactions JTA.
11.6.2.2. Configuration d'une source de données XA Copier lienLien copié sur presse-papiers!
Pour pouvoir ajouter une source de données XA, vous devrez vous connecter à la console de gestion. Voir Section 11.6.2.3, « Se conncecter à la console de gestion » pour plus d'informations.
Ajouter une nouvelle source de données.
Ajouter une nouvelle source de données à la plateforme JBoss EAP 6. Suivre les instructions qui se trouvent dans Section 11.6.2.4, « Créer une source de données non-XA avec les interfaces de gestion », puis, cliquer sur l'onglet XA Datasource en haut.Configurer les propriétés supplémentaires suivant les besoins.
Tous les paramètres de la source de données se trouvent dans Section 11.6.2.6, « Paramètres de source de données ».
Votre source de données XA est configurée et elle est prête à l'utilisation.
11.6.2.3. Se conncecter à la console de gestion Copier lienLien copié sur presse-papiers!
Conditions préalables
- Vous devez créer un utilisateur administratif. Pour obtenir des instructions complètes, voir Add the User for the Management Interfaces qui se trouve dans le guide Administration and Configuration Guide de JBoss Enterprise Application Platform.JBoss EAP doit être en cours d'exécution.
Naviguer vers la page de démarrage de la console de gestion
Lancez votre navigateur web et accédez à la Console de gestion dans votre navigateur web dans http://localhost:9990/console/App.htmlNote
Port 9990 est prédéfini en tant que liaison de socket de Console de gestion.- Saisir le nom d'utilisateur et le mot de passe du compte que vous avez déjà créés pour vous connecter à l'écran de connexion de la console de gestion.
Figure 11.1. Écran de connexion de la console de gestion
Une fois connecté, vous serez redirigé à l'adresse suivante et la page d'accueil de la Console de gestion apparaîtra : http://localhost:9990/console/App.html#home
11.6.2.4. Créer une source de données non-XA avec les interfaces de gestion Copier lienLien copié sur presse-papiers!
Cette section explique les étapes à suivre pour créer une source de données non-XA, en utilisant la console de gestion ou l'interface CLI.
Conditions préalables
- Le serveur JBoss EAP 6 doit être en cours d'exécution.
Note
Procédure 11.2. Créer une source de données en utilisant l'interface CLI ou la console de gestion
Interface CLI
- Lancer le CLI et connectez-vous à votre serveur.
- Exécuter la commande d'interface de gestion CLI suivante pour créer une source de données non-XA, et configurer les variables comme il se doit :
Note
La valeur de DRIVER_NAME (nom de pilote) dépend du nombre de classes répertoriées dans le fichier/META-INF/services/java.sql.Driversitué dans le JAR du pilote JDBC. S'il n'y a qu'une seule classe, la valeur correspondra au nom du JAR. S'il y a plusieurs classes, la valeur correspondra au nom du JAR + driverClassName + « _ » + majorVersion + « _ » + minorVersion. Toute erreur provoquera l'erreur suivante dans le journal :JBAS014775: New missing/unsatisfied dependencies
JBAS014775: New missing/unsatisfied dependenciesCopy to Clipboard Copied! Toggle word wrap Toggle overflow Par exemple, la valeur de DRIVER_NAME qu'il nous faut pour le pilote MySQL 5.1.31 estmysql-connector-java-5.1.31-bin.jarcom.mysql.jdbc.Driver_5_1.data-source add --name=DATASOURCE_NAME --jndi-name=JNDI_NAME --driver-name=DRIVER_NAME --connection-url=CONNECTION_URL
data-source add --name=DATASOURCE_NAME --jndi-name=JNDI_NAME --driver-name=DRIVER_NAME --connection-url=CONNECTION_URLCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Activer la source de données :
data-source enable --name=DATASOURCE_NAME
data-source enable --name=DATASOURCE_NAMECopy to Clipboard Copied! Toggle word wrap Toggle overflow
Console de gestion
- Connectez-vous à la console de gestion.
Naviguer dans le panneau Datasources qui se trouve dans la console de gestion
- Sélectionner Configuration qui se trouve en haut de la console.
- En mode de domaine uniquement, sélectionner un profil à partir du menu déroulant qui se trouve en haut et à gauche.
- Étendre le menu qui se trouve à gauche de la console, puis étendre le menu .
- Sélectionner à partir du menu à gauche de la console.
Créer une nouvelle source de données
- Cliquer sur qui se trouve en haut du panneau Datasources.
- Saisir les attributs de la nouvelle source de données de l'assistant Create Datasource et appuyez sur .
- Saisir les informations sur le pilote JDBC dans l'assistant Create Datasource et cliquer sur pour continuer.
- Saisir les paramètres de connexion dans l'assistant Create Datasource.
- Cliquer sur le bouton pour tester la connexion à la ressource de données et vérifier que les paramètres de configuration sont corrects.
- Cliquer sur pour terminer.
La source de données non-Xa a été ajoutée au serveur. Elle est maintenant visible dans le fichier standalone.xml ou le fichier domain.xml, ainsi que dans les interfaces de gestion.
11.6.2.5. Configuration des paramètres de validation de connexion de la base de données Copier lienLien copié sur presse-papiers!
En raison de problèmes de maintenance de base de données, de problèmes de réseau ou autres événements peuvent amener JBoss EAP 6 à perdre la connexion à la base de données. Vous activez la validation de la connexion à la base de données par l'élément < validation > dans la section < datasource > du fichier de configuration du serveur. Suivez les étapes ci-dessous pour configurer les paramètres de source de données pour activer la validation de connexion de la base de données dans JBoss EAP 6.
Procédure 11.3. Configuration des paramètres de validation de connexion de la base de données
Choisissez une méthode de validation
Veuillez sélectionner une des méthodes de validation suivantes.<validate-on-match>true</validate-on-match>
Lorsque l'option< validate-on-match >a comme valeurtrue, la connexion à la base de données est validée à chaque retrait du pool de connexions en utilisant le mécanisme de validation spécifié à l'étape suivante.Si une connexion n'est pas valide, un avertissement sera inscrit dans le journal et la prochaine connexion sera extraite du pool. Ce processus se poursuit jusqu'à ce qu'une connexion valide soit enfin trouvée. Si vous préférez ne pas faire défiler chaque connexion du pool, vous pouvez utiliser l'option<use-fast-fail>. Si on ne trouve pas de connexion valide dans le pool, une nouvelle connexion sera créée. Si la création de la connexion échoue, une exception sera retournée à l'application qui en a fait la demande.Ce paramètre entraîne une récupération plus rapide, mais crée une charge plus élevée sur la base de données. Cependant, c'est la sélection la plus sûre si une baisse de performance minimale n'est pas un sujet de préoccupation.<background-validation>true</background-validation>
Lorsque l'option< >background-validationa comme valeurtrue, il est utilisé en combinaison à la valeur<background-validation-millis>pour déterminer la fréquence d'exécution de l'information en d'arrière-plan. La valeur par défaut du paramètre<background-validation-millis>est de 0 millisecondes, ce qui signifie que c'est désactivé par défaut. Cette valeur ne doit pas être à la même valeur que celle du paramètre< idle-timeout-minutes >.Il est délicat de déterminer la valeur optimale de<background-validation-millis>pour un système particulier. Plus la valeur est faible, le plus fréquemment le pool sera validé et le plus rapidement les connexions plus tôt non valides sont supprimées du pool. Cependant, des valeurs les plus faibles prennent davantage de ressources de base de données. En outre, les valeurs élevées ont des contrôles de validation de connexion plus fréquents et utilisent moins de ressources de base de données, mais les liens morts demeurent indétectables pendant de plus longues périodes.
Note
Si l'option<validate-on-match>est définie àtrue, l'option<background-validation>devra être définie àfalse. Le contraire est vrai également. Si l'option<background-validation>est définie àtrue, l'option<validate-on-match>devra être définie àfalse.Choisir un mécanisme de validation
Veuillez sélectionner un des mécanismes de validation suivants.Spécifier un Nom de classe <valid-connection-checker>
Il s'agit du mécanisme préféré car il est optimisé pour un RBMS particulier. JBoss EAP 6 fournit les vérificateurs de connexions suivants :- org.jboss.jca.adapters.jdbc.extensions.db2.DB2ValidConnectionChecker
- org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLValidConnectionChecker
- org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLReplicationValidConnectionChecker
- org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLValidConnectionChecker
- org.jboss.jca.adapters.jdbc.extensions.novendor.JDBC4ValidConnectionChecker
- org.jboss.jca.adapters.jdbc.extensions.novendor.NullValidConnectionChecker
- org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker
- org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker
- org.jboss.jca.adapters.jdbc.extensions.sybase.SybaseValidConnectionChecker
Indiqué l'énoncé SQL pour <check-valid-connection-sql>
Vous fournissez l'énoncé SQL utilisé pour valider la connexion.Ce qui suit est un exemple qui vous montre comment spécifier un énoncé SQL pour valider une connexion dans Oracle :Dans MySQL ou PostgreSQL, vous pouvez spécifier l'énoncé SQL suivant :<check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>
<check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>Copy to Clipboard Copied! Toggle word wrap Toggle overflow <check-valid-connection-sql>select 1</check-valid-connection-sql>
<check-valid-connection-sql>select 1</check-valid-connection-sql>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Définir le Nom de classe <exception-sorter>
Lorsqu'une exception est marquée comme étant fatale, la connexion est fermée immédiatement, même si la connexion participe à une transaction. Utilisez l'option de classe de triage d'exception trieuse pour détecter correctement et ensuite nettoyer les exceptions de connexion fatales. JBoss EAP 6 fournit les trieurs d'exception suivants :- org.jboss.jca.adapters.jdbc.extensions.db2.DB2ExceptionSorter
- org.jboss.jca.adapters.jdbc.extensions.informix.InformixExceptionSorter
- org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLExceptionSorter
- org.jboss.jca.adapters.jdbc.extensions.novendor.NullExceptionSorter
- org.jboss.jca.adapters.jdbc.extensions.oracle.OracleExceptionSorter
- org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter
- org.jboss.jca.adapters.jdbc.extensions.sybase.SybaseExceptionSorter
11.6.2.6. Paramètres de source de données Copier lienLien copié sur presse-papiers!
| Paramètre | Description |
|---|---|
| jndi-name | Le nom JNDI unique pour la source de données. |
| pool-name | Le nom du pool de gestion de la source de données. |
| enabled | Indique si la source de données est activée. |
| use-java-context |
Indique si on doit relier la source de données au JNDI global.
|
| spy |
Activer la fonctionnalité
spy sur la couche JDBC. Cela journalisera tout le trafic JDBC dans la source de données. Notez que la catégorie de journalisation jboss.jdbc.spy doit également être définie au niveau DEBUG dans le sous-système de journalisation.
|
| use-ccm | Activer le gestionnaire de connexion cache. |
| new-connection-sql | Un énoncé SQL qui exécute quand la connexion est ajoutée au pool de connexion. |
| transaction-isolation |
Un parmi :
|
| url-selector-strategy-class-name | Une classe qui implémente l'interface org.jboss.jca.adapters.jdbc.URLSelectorStrategy. |
| sécurité |
Contient des éléments dépendants en tant que paramètres de sécurité. Voir Tableau 11.6, « Paramètres de sécurité ».
|
| validation |
Contient des éléments dépendants en tant que paramètres de validation. Voir Tableau 11.7, « Paramètres de validation ».
|
| timeout |
Contient des éléments dépendants en tant que paramètres de timeout. Voir Tableau 11.8, « Paramètres de timeout ».
|
| énoncé |
Contient des éléments dépendants en tant que paramètres d'énoncés. Voir Tableau 11.9, « Paramètres d'instruction ».
|
| Paramètre | Description |
|---|---|
| jta | Active l'intégration JTA pour les sources de données non-XA. Ne s'applique pas aux sources de données XA. |
| connection-url | L'URL de connexion du pilote JDBC. |
| driver-class | Le nom complet de la classe de pilote JDBC. |
| connection-property |
Propriétés de connexions arbitraires passées à la méthode
Driver.connect(url,props). Chaque connection-property indique une paire name/value. Le nom de la propriété provient du nom, et la valeur provient du contenu de l'élément.
|
| pool |
Contient des éléments dépendants en tant que paramètres de pooling. Voir Tableau 11.4, « Les paramètres de pool communs aux sources XA ou non-XA ».
|
| url-delimiter |
Le délimiteur d'URLs d'une connexion url pour les bases de données clusterisées HA (Haute disponibilité).
|
| Paramètre | Description |
|---|---|
| xa-datasource-property |
Une propriété pour assigner la classe d'implémentation
XADataSource. Spécifiée par name=value. Si une méthode setter existe, dans le format setName, la propriété sera définie en appelant une méthode setter sous le format setName(value).
|
| xa-datasource-class |
Le nom complet de la classe d'implémentation de
javax.sql.XADataSource.
|
| pilote |
Unique référence au module de chargeur de classe qui contient le pilote JDBC. Le format accepté est driverName#majorVersion.minorVersion.
|
| xa-pool |
Contient des éléments dépendants en tant que paramètres de pooling. Voir Tableau 11.4, « Les paramètres de pool communs aux sources XA ou non-XA » et Tableau 11.5, « Paramètres du pool XA ».
|
| recouvrement |
Contient des éléments dépendants en tant que paramètres de recouvrement. Voir Tableau 11.10, « Paramètres de recouvrement ».
|
| Paramètre | Description |
|---|---|
| min-pool-size | Le nombre minimum de connexions contenues par un pool. |
| max-pool-size | Le nombre maximum de connexions qu'un pool peut contenir |
| Pré-remplissage | Indique si l'on doit essayer de pré-remplir un pool de connexion. Un élément vide indique une valeur true. La valeur par défaut est false. |
| use-strict-min | Indique si la taille du pool est stricte. false par défaut. |
| flush-strategy |
Indique si le pool est vidé en cas d'erreur. Les valeurs acceptées sont :
La valeur par défaut est
FailingConnectionOnly.
|
| allow-multiple-users | Indique si plusieurs utilisateurs pourront avoir accès à la source de données par la méthode getConnection(user, password), et si les types de pools internes ont une influence sur ce comportement. |
| Paramètre | Description |
|---|---|
| is-same-rm-override | Indique si la classe javax.transaction.xa.XAResource.isSameRM(XAResource) retourne true ou false. |
| entrelacement | Indique si on doit activer l'entrelacement pour les fabriques de connexion XA. |
| no-tx-separate-pools |
Indique si on doit créer des sous-répertoires distincts pour chaque contexte. Cela est nécessaire pour les sources de données Oracle, qui ne permettent pas aux connexions XA d'être utilisées à la fois à l'intérieur et à l'extérieur d'une transaction de JTA
Utiliser cette option entraînera la multiplication par deux de la taille du pool
max-pool-size, car en fait, deux pools seront créés.
|
| pad-xid | Indique si on doit remplir le Xid. |
| wrap-xa-resource |
Indique si on doit inclure XAResource dans une instance
org.jboss.tm.XAResourceWrapper.
|
| Paramètre | Description |
|---|---|
| user-name | Le nom d'utilisation pour créer une nouvelle connexion. |
| password | Le mot de passe à utiliser pour créer une nouvelle connexion |
| security-domain | Contient le nom d'un gestionnaire de sécurité JAAS, qui gère l'authentification. Ce nom correspond à l'attribut application-policy/name de la configuration de connexion JAAS. |
| reauth-plugin | Définit un plugin d'authentification à nouveau pour la réauthentification de connexions physiques. |
| Paramètre | Description |
|---|---|
| valid-connection-checker |
Une mise en œuvre d'interface
org.jboss.jca.adaptors.jdbc.ValidConnectionChecker qui fournit une méthode SQLException.isValidConnection(Connection e) pour valider une connexion. Une exception signifie que la connexion est détruite. Cela remplace le paramètre check-valid-connection-sql s'il est présent.
|
| check-valid-connection-sql | Un énoncé SQL pour vérifier la validité d'un pool de connexion. Peut être appelé quand une connexion gérée est tirée d'un pool. |
| validate-on-match |
Indique si la validation de niveau de connexion est exécutée lorsqu'une fabrique de connexions essaie de correspondre à une connexion gérée pour un ensemble donné.
Indiquer "true" pour
validate-on-match n'est pas normalement fait en conjonction avec "true" pour background-validation. Validate-on-match est utile quand un client doit avoir une connexion vallidée avant utilisation. Ce paramètre est à false par défaut.
|
| background-validation |
Indique que les connexions sont validées sur un thread d'arrière-plan. La validation de l'arrière-plan (Background validation) est une optimisation de performance lorsque non utilisé avec
validate-on-match. Si Validate-on-match est sur true, l'utilisation de background-validation pourrait entraîner des contrôles redondants. La validation de l'arrière-plan pourrait provoquer une mauvaise connexion (une connexion qui irait mal entre le moment de l'analyse de validation et avant d'être donnée au client), l'application cliente doit par conséquent tenir compte de cette possibilité.
|
| background-validation-millis | La durée, en millisecondes, pendant laquelle la validation d'arrière-plan exécute. |
| use-fast-fail |
Si défini sur true, échoue une allocation de connexion lors de la première tentative, si la connexion est non valide. La valeur par défaut est
false.
|
| stale-connection-checker |
Une instance de
org.jboss.jca.adapters.jdbc.StaleConnectionChecker qui produit une méthode booléenne isStaleConnection(SQLException e). Si cette méthode renvoie un true, l'exception sera contenue dans org.jboss.jca.adapters.jdbc.StaleConnectionException, qui correspond à une sous-classe de SQLException.
|
| exception-sorter |
Une instance de
org.jboss.jca.adapters.jdbc.ExceptionSorter qui fournit une méthode booléenne isExceptionFatal(SQLException e). Cette méthode validera si une exception est envoyée à toutes les instances d'un javax.resource.spi.ConnectionEventListener en tant que message connectionErrorOccurred.
|
| Paramètre | Description |
|---|---|
| use-try-lock | Utiliser tryLock() au lieu de lock(). Vous essayerez ainsi d'obtenir un verrou pour le nombre de secondes configurées, avant le timeout, au lieu d'échouer immédiatement quand le verrou n'est pas disponible. La valeur par défaut est de 60 secondes. Par exemple, pour définir un timeout de 5 minutes, définir <use-try-lock>300</use-try-lock>. |
| blocking-timeout-millis | La durée maximale, en millisecondes, de blocage lorsque vous attendez une connexion. Après que ce délai soit dépassé, une exception sera levée. Cela bloque uniquement pendant que vous attendez un permis de connexion et ne lève pas d'exception si la création d'une nouvelle connexion prend beaucoup de temps. Par défaut, 30000, qui correspond à 30 secondes. |
| idle-timeout-minutes |
La durée maximale, en minutes, avant qu'une connexion inactive soit fermée. La durée maximale réelle dépend de la durée d'analyse de l'idleRemover, qui correspond à la moitié du plus petit
idle-timeout-minutes de n'importe quel pool.
|
| set-tx-query-timeout |
Indique si on doit définir le timeout d'interrogation par rapport au temps qui reste avant le timeout de transaction. Si aucune transaction n'existe, on utilisera le timeout de recherche qui a été configuré. La valeur par défaut est
false.
|
| query-timeout | Timeout pour les recherches, en secondes. La valeur par défaut est « no timeout ». |
| allocation-retry | Le nombre de tentatives de connexions avant d'envoyer une connexion. La valeur par défaut est 0, pour qu'une exception puisse être envoyée à la première défaillance. |
| allocation-retry-wait-millis |
Le temps, en millisecondes, qu'il faut attendre avant de retenter d'allouer une connexion. La valeur par défaut est 5 000, soit 5 secondes.
|
| xa-resource-timeout |
Si la valeur est non nulle, elle passe à la méthode
XAResource.setTransactionTimeout.
|
| Paramètre | Description |
|---|---|
| track-statements |
Indique si l'on doit vérifier les instructions non fermées lorsqu'une connexion est renvoyée à un pool ou qu'une instruction est retournée dans le cache d'instruction préparée. Si false, les instructions ne seront pas suivies.
|
| prepared-statement-cache-size | Le nombre d'instructions préparées par connexion, dans le cache LRU (le moins souvent utilisé récemment). |
| share-prepared-statements |
Indique si le fait de demander la même instruction deux fois sans la fermer utilise la même instruction préparée sous-jacente. La valeur par défaut est
false.
|
| Paramètre | Description |
|---|---|
| recover-credential | Une paire nom d'utilisateur/mot de passe ou domaine de sécurité pour le recouvrement. |
| recover-plugin |
Une implémentation de la classe
org.jboss.jca.core.spi.recoveryRecoveryPlugin à utiliser pour le recouvrement.
|
11.6.3. Journalisation des transactions Copier lienLien copié sur presse-papiers!
11.6.3.1. Messages de journalisation de transactions Copier lienLien copié sur presse-papiers!
DEBUG pour le logger de transaction. Pour un débogage détaillé, utiliser le niveau de journalisation TRACE. Veuillez consulter Section 11.6.3.2, « Configurer la journalisation des sous-systèmes de transactions » pour plus d'informations sur la configuration du logger de transaction.
TRACE. Vous trouverez ci-dessous quelques-uns des messages les plus courants. Cette liste n'est pas exhaustive, il se peut que vous rencontriez d'autres messages.
| Début de transaction |
Quand une transaction commence, le code suivant s'exécute :
com.arjuna.ats.arjuna.coordinator.BasicAction::Begin:1342
tsLogger.logger.trace("BasicAction::Begin() for action-id "+ get_uid());
|
| Validation de transaction |
Quand une transaction est validée, le code suivant s'exécute :
com.arjuna.ats.arjuna.coordinator.BasicAction::End:1342
tsLogger.logger.trace("BasicAction::End() for action-id "+ get_uid());
|
| Restauration de transaction |
Quand une transaction est restaurée, le code suivant s'exécute :
com.arjuna.ats.arjuna.coordinator.BasicAction::Abort:1575
tsLogger.logger.trace("BasicAction::Abort() for action-id "+ get_uid());
|
| Délai d'expiration de transaction |
Quand une transaction expire, le code suivant s'exécute :
com.arjuna.ats.arjuna.coordinator.TransactionReaper::doCancellations:349
tsLogger.logger.trace("Reaper Worker " + Thread.currentThread() + " attempting to cancel " + e._control.get_uid());
Vous verrez ensuite le même thread restaurer la transaction comme montré ci-dessus.
|
11.6.3.2. Configurer la journalisation des sous-systèmes de transactions Copier lienLien copié sur presse-papiers!
Utiliser cette procédure pour contrôler la quantité d'informations enregistrées sur les transactions, indépendamment des autres paramètres de journalisation dans JBoss EAP 6. La procédure montre comment procéder dans la console de gestion sur le web. La commande de gestion CLI est donnée par la suite.
Procédure 11.4. Configurer l'enregistreur de transactions (Transaction Logger) par la console de gestion
Naviguer vers la zone de configuration de la journalisation
Dans la console de gestion, cliquer sur l'onglet Configuration. Si vous utilisez un domaine géré, fermer le profil du serveur que vous souhaitez configurer, à partir de la case de sélection Profile qui se trouve en haut et à gauche.Étendre le menu Core, et sélectionner Logging.Modifier les attributs de
com.arjuna.Sélectionner l'onglet Log Categories. Sélectionnercom.arjuna, puis Edit dans Details. Vous pourrez ajouter ici les informations de journalisation spécifiques à la classe. La classecom.arjunaest déjà présente. Vous pourrez modifier le niveau de journalisation et décider si vous souhaitez utiliser les gestionnaires parents.- Niveau de journalisation
- Le niveau de journalisation est
WARNpar défaut. Comme les transactions peuvent produire une grande quantité de messages de journalisation, la signification des niveaux de journalisation standard est légèrement différente pour l'enregistreur de transactions. En général, les messages avec des niveaux de gravité moins élevés que le niveau choisi seront ignorés.Niveaux de journalisation des transactions, du plus au moins détaillé.
- TRACE
- DEBOG
- INFO
- AVERTISSEMENT
- ERREUR
- FAILURE
- Utiliser les gestionnaires parents
- Indique si l'enregistreur d'événements doit envoyer ses sorties vers l'enregistreur d'événements parent. Le comportement par défaut est
true.
- Les changements prennent effet immédiatement.
11.6.3.3. Naviguer et gérer les transactions Copier lienLien copié sur presse-papiers!
log-store. Une opération API nommée probe lit les journaux de transactions et crée un noeud pour chaque journal. Vous pouvez invoquer la commande probe manuellement, quand vous souhaitez réactualiser le log-store. Il est normal pour les journaux de transaction d'apparaitre ou de disparaitre rapidement.
Exemple 11.2. Réactualiser le log store
default dans un domaine géré. Dans le cas d'un serveur autonome, supprimer profile=default de la commande.
/profile=default/subsystem=transactions/log-store=log-store/:probe
/profile=default/subsystem=transactions/log-store=log-store/:probe
Exemple 11.3. Voir toutes les transactions préparées
ls de système de fichiers.
ls /profile=default/subsystem=transactions/log-store=log-store/transactions
ls /profile=default/subsystem=transactions/log-store=log-store/transactions
Gérer une transaction
- Voir des attributs de transaction.
- Pour voir des informations sur une transaction, comme son nom JNDI, son nom de produit EIS ou sa version, ou encore son statut, utiliser la commande CLI
:read-resource./profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9:read-resource
/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9:read-resourceCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Voir tous les participants à une transaction.
- Chaque journal de transaction contient un élément enfant nommé
participants. Utiliser la commande CLIread-resourcesur cet élément pour voir les participants des transactions. Les participants sont identifiés par leur nom JNDI./profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9/participants=java\:\/JmsXA:read-resource
/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9/participants=java\:\/JmsXA:read-resourceCopy to Clipboard Copied! Toggle word wrap Toggle overflow Le résultat doit ressembler à ceci :Copy to Clipboard Copied! Toggle word wrap Toggle overflow Le statut du résultat affiché ici est dans un étatHEURISTICet est susceptible d'être recouvré. Voir Recouvrement d'une transaction. pour plus d'informations.Dans certains cas, il est possible de créer des enregistrements orphelins dans l'object store, c-a-d XAResourceRecords, qui n'a pas d'enregistrement de transaction correspondante dans le journal. Par exemple, la ressource XA s'était préparée mais avait échoué avant le TM enregistré et est inaccessible à l'API de gestion du domaine. Pour accéder à de tels enregistrements, vous devez définir l'option de gestionexpose-all-logsàtrue. Cette option n'est pas sauvegardée dans le modèle de gestion et est restaurée àfalsequand le serveur redémarre à nouveau./profile=default/subsystem=transactions/log-store=log-store:write-attribute(name=expose-all-logs, value=true)
/profile=default/subsystem=transactions/log-store=log-store:write-attribute(name=expose-all-logs, value=true)Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Supprimer une transaction.
- Chaque journal de transaction supporte une opération
:deletepour effacer l'enregistrement qui représente la transaction./profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9:delete
/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9:deleteCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Recouvrement d'une transaction.
- Chaque participant de transaction supporte le recouvrement par la commande CLI
:recover./profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9/participants=2:recover
/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9/participants=2:recoverCopy to Clipboard Copied! Toggle word wrap Toggle overflow Recouvrement des transactions heuristiques et des participants
- Si le statut de la transaction est
HEURISTIC, l'opération de recouvrement change l'état enPREPAREet déclenche un recouvrement. - Si l'un des participants de la transaction est heuristique, l'opération de recouvrement tente de reprendre l'opération
commit(validation) à nouveau. En cas de succès, le participant est retiré du journal des transactions. Vous pouvez vérifier cela en exécutant à nouveau l'opération:probesur lelog-storeet en vérifiant que le participant n'est plus inscrit. Si c'est le dernier participant, la transaction sera également supprimée.
- Réactualiser le statut de la transaction qui a besoin d'être recouvrée.
- Si une transaction a besoin d'être recouvrée, vous pourrez utiliser la commande CLI
:refreshpour vous assurer qu'elle a toujours besoin d'être recouvrée, avant de tenter le recouvrement./profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9/participants=2:refresh
/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9/participants=2:refreshCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Si les statistiques de Transaction manager sont activées, vous pouvez consulter les statistiques à propos du gestionnaire de transactions et du sous-système de transaction. Veuillez consulter Section 11.7.8.2, « Configurer le Transaction Manager (TM) (ou gestionnaire de transactions) » pour plus d'informations sur l'activation des statistiques de Transaction manager.
| Statistique | Description | CLI Command |
|---|---|---|
| Total |
Le nombre total de transactions exécutées par le gestionnaire de transactions sur ce serveur.
| /host=master/server=server-one/subsystem=transactions/:read-attribute(name=number-of-transactions,include-defaults=true)
|
| Validé |
Le nombre de transactions validées exécutées par le gestionnaire de transactions sur ce serveur.
| /host=master/server=server-one/subsystem=transactions/:read-attribute(name=number-of-committed-transactions,include-defaults=true)
|
| Abandonné |
Le nombre de transactions interrompues exécutées par le gestionnaire de transactions sur ce serveur.
| /host=master/server=server-one/subsystem=transactions/:read-attribute(name=number-of-aborted-transactions,include-defaults=true)
|
| Délai expiré |
Le nombre de transactions expirées exécutées par le gestionnaire de transactions sur ce serveur.
| /host=master/server=server-one/subsystem=transactions/:read-attribute(name=number-of-timed-out-transactions,include-defaults=true)
|
| Heuristiques |
Pas disponible dans la console de gestion. Nombre de transactions dans un état heuristique.
| /host=master/server=server-one/subsystem=transactions/:read-attribute(name=number-of-heuristics,include-defaults=true)
|
| Transactions In-Flight |
Pas disponible dans la console de gestion. Nombre de transactions commencées non achevées.
| /host=master/server=server-one/subsystem=transactions/:read-attribute(name=number-of-inflight-transactions,include-defaults=true)
|
| Origine de l'échec - Applications |
Le nombre de transactions échouées dont l'origine de l'échec était une application.
| /host=master/server=server-one/subsystem=transactions/:read-attribute(name=number-of-application-rollbacks,include-defaults=true)
|
| Origine de l'échec - Ressources |
Le nombre de transactions échouées dont l'origine de l'échec était une ressource.
| /host=master/server=server-one/subsystem=transactions/:read-attribute(name=number-of-resource-rollbacks,include-defaults=true)
|
| ID Participant |
L'ID du participant.
| /host=master/server=server-one/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9:read-children-names(child-type=participants)
|
| Liste de toutes les transactions |
La liste complète des transactions.
| /host=master/server=server-one/subsystem=transactions/log-store=log-store:read-children-names(child-type=transactions)
|
11.7. Utiliser les transactions JTA Copier lienLien copié sur presse-papiers!
11.7.1. Transactions JTA Copier lienLien copié sur presse-papiers!
Les procédures suivantes sont utiles quand vous aurez besoin d'utiliser des transactions dans votre application.
11.7.2. Transactions de contrôle Copier lienLien copié sur presse-papiers!
Cette liste de procédures expose les différentes façons de contrôler les transactions dans vos applications utilisant les API JTA ou JTS.
11.7.3. Démarrer une transaction Copier lienLien copié sur presse-papiers!
Obtenez une instance de
UserTransaction.Vous pouvez obtenir une instance par JNDI, injection, ou un contexte d'EJB, si l'EJB utilise des transactions gérées-bean, par le biais de l'annotation@TransactionManagement(TransactionManagementType.BEAN).JNDI
new InitialContext().lookup("java:comp/UserTransaction")new InitialContext().lookup("java:comp/UserTransaction")Copy to Clipboard Copied! Toggle word wrap Toggle overflow Injection
@Resource UserTransaction userTransaction;
@Resource UserTransaction userTransaction;Copy to Clipboard Copied! Toggle word wrap Toggle overflow Contexte
- Pour un bean stateless/stateful :
@Resource SessionContext ctx; ctx.getUserTransaction();
@Resource SessionContext ctx; ctx.getUserTransaction();Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Pour un bean message-driven :
@Resource MessageDrivenContext ctx; ctx.getUserTransaction()
@Resource MessageDrivenContext ctx; ctx.getUserTransaction()Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Appeler
UserTransaction.begin()une fois connecté à votre source de données.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
L'un des avantages des EJB (qu'ils soient utilisés avec CMT ou BMT) est que le conteneur gère tous les aspects internes de traitement des transactions, c'est à dire que vous êtes libre de vous occuper de transactions faisant partie de transactions XA ou de distribution de transactions dans les conteneurs EAP.
La transaction est lancée. Toute utilisation de votre source de données sera transactionnelle jusqu'à ce que vous validiez ou annuliez la transaction.
Note
11.7.4. Transactions imbriquées Copier lienLien copié sur presse-papiers!
11.7.5. Valider une transaction Copier lienLien copié sur presse-papiers!
Vous devez démarrer une transaction avant de pouvoir la valider. Pour plus d'informations sur le démarrage d'une transaction, veuillez consulter Section 11.7.3, « Démarrer une transaction ».
Appeler la méthode
commit()surUserTransaction.Lorsque vous appelez la méthodecommit()surUserTransaction, le gestionnaire de transactions tente de valider la transaction.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Si vous utilisez des CMT (Container Managed Transactions), vous n'avez pas besoin de valider manuellement.
Si vous configurez votre bean pour qu'il puisse utiliser des transactions gérées conteneur, le conteneur devra gérer le cyle de vie des transactions pour vous sur la base d'annotations que vous aurez configurées dans le code.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Votre source de données valide et votre transaction se termine, ou une exception est lancée.
Note
11.7.6. Annuler une transaction Copier lienLien copié sur presse-papiers!
Vous devez démarrer une transaction avant de pouvoir la supprimer. Pour plus d'informations sur le démarrage d'une transaction, veuillez consulter Section 11.7.3, « Démarrer une transaction ».
Appeler la méthode
rollback()surUserTransaction.Lorsque vous appelez la méthoderollback()surUserTransaction, le gestionnaire de transactions tentera de valider la transaction.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Si vous utilisez des CMT (Container Managed Transactions), vous n'avez pas besoin de supprimer la transaction manuellement.
Si vous configurez votre bean pour qu'il puisse utiliser des transactions gérées conteneur, le conteneur devra gérer le cyle de vie des transactions pour vous sur la base d'annotations que vous aurez configurées dans le code.Note
Une annulation CMT se produit en cas d'exception RuntimeException. Vous pouvez également invoquer la méthodesetRollbackOnlypour l'annulation ou utiliser@ApplicationException(rollback=true) pour obtenir une exception d'application pour l'annulation.
Votre transaction est annulée par le gestionnaire de transactions.
Note
11.7.7. Gérer un résultat heuristique dans une transaction Copier lienLien copié sur presse-papiers!
Procédure 11.5. Gérer un résultat heuristique dans une transaction
Déterminer la cause
En général, la cause d'un résultat heuristique pour une transaction est qu'un gestionnaire de ressources a promis qu'il pourrait commettre ou annuler, et il n'a pas pu remplir sa promesse. Cela pouvait être dû à un problème avec un composant de tierce partie, la couche d'intégration entre le composant tiers et la plate-forme EAP 6 ou bien la plate-forme JBoss EAP 6 elle-même.De loin, les deux causes les plus communes d'erreurs heuristiques sont des erreurs temporaires situées dans l'environnement ou des erreurs de code liées aux gestionnaires de ressources.Solution aux échecs temporaires de l'environnement
Normalement, s'il y a un échec temporaire dans votre environnement, vous le saurez avant d'être au courant de l'erreur heuristique. Il peut s'agir d'une défaillance de réseau ou de matériel, d'une erreur de base de données, d'une panne de courant, d'un hôte ou de tout autre cause.En cas de résultat heuristique ayant lieu dans un environnement de test, au cours de test de stress, cela vous fournit des informations sur les points faibles de votre environnement.Avertissement
La plate-forme JBoss EAP 6 restaurera automatiquement les transactions qui ne sont pas dans un état heuristique au moment de la défaillance, mais elle ne tentera pas de restaurer les transactions heuristiques.Contacter les fournisseurs de gestionnaires de ressources
Si vous n'expérimentez aucun échec évident dans votre environnement, ou si le résultat heuristique est facilement reproductible, c'est probablement une erreur de codage. Contacter les fournisseurs de tierce partie pour savoir si une solution est disponible. Si vous pensez que le problème est dans le gestionnaire de transactions de la plate-forme JBoss EAP 6 elle-même, veuillez prendre contact avec Red Hat Global Support Services.Dans un environnement de test, supprimer les logs et démarrez à nouveau la plate-forme JBoss EAP 6.
Dans un environnement de test, ou bien dans les cas où vous ne vous souciez pas de l'intégrité des données, le fait de supprimer les journaux des transactions et de redémarrer la plate-forme JBoss EAP 6 se débarrasse du résultat heuristique. Les journaux des transactions sont situés dansEAP_HOME/standalone/data/tx-object-store/pour les serveurs autonomes, ou dansEAP_HOME/domain/servers/SERVER_NAME/data/tx-object-storepour les domaines gérés, par défaut. Dans le cas d'un domaine géré, SERVER_NAME se rapporte au nom du serveur individuel qui participe à un groupe de serveurs.Note
L'emplacement du journal de transactions dépend aussi du store d'objets en usage et des valeurs définies des paramètresoject-store-relative-toetobject-store-path. Pour les journaux de système de fichier (journaux en mémoire fantôme standard et les journaux HornetQ), la localisation de direction par défaut est utilisée, mais lorsque vous utilisez un magasin d'objets JDBC, les journaux des transactions sont stockés dans une base de données.Résoudre le résultat à la main
Le processus de résolution de résultat à la main dépend des circonstances particulières de l'incident. Normalement, vous aurez besoin de procéder aux étapes suivantes, en les appliquant à votre situation.- Identifier les gestionnaires de ressources impliqués.
- Examiner l'état dans le gestionnaire de transactions et dans les gestionnaires de ressources.
- Forcer manuellement le nettoyage des journaux et la reconciliation des données dans un ou plusieurs des composants impliqués.
La façon dont procéder à ces étapes va delà de la portée de ce document.
11.7.8. Temps d'expiration des transactions Copier lienLien copié sur presse-papiers!
11.7.8.1. Les délais d'attente des transactions Copier lienLien copié sur presse-papiers!
11.7.8.2. Configurer le Transaction Manager (TM) (ou gestionnaire de transactions) Copier lienLien copié sur presse-papiers!
default, il se peut que vous ayiez à modifier les étapes et les commandes de la manière suivante.
Notes sur les commandes d'exemple
- Pour la console de gestion, le profil par défaut
defaultest celui qui sera sélectionné quand vous vous connectez. Si vous souhaitez modifier la configuration du gestionnaire de transactions (TM) dans un autre profile, sélectionnez votre profile à la place, et non pasdefault, pour chaque instruction.De même, substituez votre profil à la place du profil par défautdefaultpour les commandes CLI de l'exemple. - Si vous utilisez un serveur autonome, un seul profil existe. Ignorer toute instruction pour choisir un profil spécifique. Dans les commandes CLI, retirer la partie
/profile=defaultdes commandes d'échantillon.
Note
transactions doit être activé. Il est activé par défaut, et il faut pour cela qu'un certain nombre d'autres sous-systèmes fonctionnent correctement, donc il est improbable qu'il soit désactivé.
Pour configurer le gestionnaire de transactions (TM) à l'aide de la console de gestion sur le web, sélectionnez l'onglet Configuration en haut de l'écran. Si vous utilisez un domaine géré, vous avez le choix de plusieurs profils. Choisir le bon Profile de la boîte de sélection dans la partie supérieure gauche de l'écran. Étendez le menu Container, et sélectionnez Transactions.
Dans l'interface CLI, vous pouvez configurer le TM en utilisant une série de commandes. Les commandes commencent toutes par /profile=default/subsystem=transactions/ pour un domaine géré avec default de profil, ou par /subsystem=transactions pour un serveur autonome.
Important
| Option | Description | CLI Command |
|---|---|---|
|
Activer les statistiques
|
Indique s'il faut activer les statistiques de transaction. Ces statistiques se trouvent dans la console de gestion dans la section Subsystem Metrics de l'onglet Runtime.
| /profile=default/subsystem=transactions/:write-attribute(name=enable-statistics,value=true)
|
|
Activer le statut TSM
|
Indique si l'on doit activer le service de gestion du statut de transaction (TSM), qui est utilisé pour le recouvrement hors-processus. L'exécution d'un manager de recouvrement de processus pour contacter l'ActionStatusService à partir de processus différents n'est pas pris en charge (normalement contacté en mémoire).
|
Cette option de configuration n'est pas prise en charge.
|
|
Délai d'attente par défaut
|
Délai d'attente de transaction par défaut. La valeur par défaut est de
300 secondes. Vous pouvez la remplacer par programmation, sur la base d'une transaction.
| /profile=default/subsystem=transactions/:write-attribute(name=default-timeout,value=300)
|
|
Chemin de Store Objet
|
Un chemin de système de fichiers relatif ou absolu où le store objet TM stocke des données. Relatif, par défaut, à la valeur du paramètre
object-store-relative-to.
| /profile=default/subsystem=transactions/:write-attribute(name=object-store-path,value=tx-object-store)
|
|
Chemin de Store Objet Relatif à
|
Référence une configuration de chemin global dans le modèle du domaine. La valeur par défaut correspond au répertoire de données de JBoss EAP 6, qui correspond à la valeur de la propriété
jboss.server.data.dir, et qui a pour valeur par défaut EAP_HOME/domain/data/ pour un domaine géré, ou EAP_HOME/standalone/data/ pour une instance de serveur autonome. La valeur de l'attribut object-store-path de l'object store est relative à ce chemin.
| /profile=default/subsystem=transactions/:write-attribute(name=object-store-relative-to,value=jboss.server.data.dir)
|
|
Liaisons de sockets
|
Indique le nom de la liaison du socket utilisé par le gestionnaire de transactions pour la récupération et la création des identificateurs de transactions, lorsque le mécanisme du socket est utilisé. Se référer à
processus-id-socket-max-ports pour plus d'informations sur la génération de l'identificateur unique. Les liaisons de socket sont spécifiées par le groupe de serveurs dans l'onglet Serveur de la console de gestion.
| /profile=default/subsystem=transactions/:write-attribute(name=socket-binding,value=txn-recovery-environment)
|
|
Statut de liaison de socket
|
Indique la liaison de socket à utiliser pour le gestionnaire de statuts de transactions.
|
Cette option de configuration n'est pas prise en charge.
|
|
Listener de recouvrement
|
Indique si oui ou non le processus de recouvrement de transactions doit écouter au socket de réseau. La valeur par défaut est
false.
| /profile=default/subsystem=transactions/:write-attribute(name=recovery-listener,value=false)
|
| Option | Description | CLI Command |
|---|---|---|
|
jts
|
Indique si l'on doit utiliser les transactions Java Transaction Service (JTS). La valeur par défaut est
false, qui utilise des transactions JTA uniquement.
| /profile=default/subsystem=transactions/:write-attribute(name=jts,value=false)
|
|
Identificateur de nœud
|
L'identificateur de noeud de gestionnaire de transactions. Cette option est requise dans les situations suivantes :
node-identifier doit être unique pour chaque gestionnaire de transaction car il doit assurer l'intégrité des données pendant le recouvrement. Le node-identifier doit également être unique à JTA car plusieurs noeuds peuvent entrer en interraction avec le même gestionnaire de ressources ou partager un object store de transactions.
| /profile=default/subsystem=transactions/:write-attribute(name=node-identifier,value=1)
|
|
process-id-socket-max-ports
|
Le gestionnaire de transactions crée un identifiant unique pour chaque journal des transactions. Deux mécanismes différents sont fournis pour générer des identificateurs uniques : un mécanisme basé sur le socket et un mécanisme fondé sur l'identificateur de processus du processus.
Dans le cas de l'identifiant basé-socket, le socket est ouvert et son numéro de port est utilisé pour l'identifiant. Si le port est déjà utilisé, on cherchera le port suivant jusqu'à ce qu'un port libre soit trouvé. Les
processus-id-socket-max-ports représentent le nombre maximal de sockets que le TM va essayer avant d'abandonner. La valeur par défaut est 10.
| /profile=default/subsystem=transactions/:write-attribute(name=process-id-socket-max-ports,value=10)
|
|
process-id-uuid
|
Définir à
true avec un identifiant de processus pour créer un identifiant unique pour chaque transaction. Sinon, le mécanisme basé socket sera utilisé. La valeur par défaut est true. Se référer à process-id-socket-max-ports pour obtenir davantage d'informations. Pour activer process-id-socket-binding, définir process-id-uuid à false.
| /profile=default/subsystem=transactions/:write-attribute(name=process-id-uuid,value=true)
|
|
process-id-socket-binding
|
Le nom de la configuration de liaison de socket à utiliser si le gestionnaire de transactions doit utiliser un id de processus basé-socket. Correspondra à
undefined si process-id-uuid est sur true; sinon il devra être défini.
| /profile=default/subsystem=transactions/:write-attribute(name=process-id-socket-binding,value=true)
|
|
use-hornetq-store
|
Utiliser les mécanismes de stockage journalisés de HornetQ au lieu du stockage basé sur des fichiers, pour les journaux de transactions. Ceci est désactivé par défaut, mais peut améliorer les performances I/O. Il n'est pas recommandé pour les transactions JTS sur les gestionnaires de transactions séparés. Quand vous changez cette option, le serveur doit démarrer à nouveau à l'aide de la commande
shutdown pour que le changement puisse prendre effet.
| /profile=default/subsystem=transactions/:write-attribute(name=use-hornetq-store,value=false)
|
11.7.9. Gestion des erreurs de transactions JTA Copier lienLien copié sur presse-papiers!
11.7.9.1. Erreurs de transactions Copier lienLien copié sur presse-papiers!
Note
Ce type d'erreur se manifeste souvent quand Hibernate n'est pas en mesure d'obtenir une connexion de base de données pour le chargement différé. Si cela survient fréquemment, vous pourrez augmenter la valeur du temps d'expiration. Voir Section 11.7.8.2, « Configurer le Transaction Manager (TM) (ou gestionnaire de transactions) ».
NotSupportedException
L'exception NotSupportedException indique habituellement que vous avez tenté d'insérer une transaction JTA, et que ce n'est pas pris en charge. Si vous n'étiez pas en train d'essayer d'insérer une transaction, il est probable qu'une autre transaction avait commencé dans une tâche de pool de threads, mais a terminé la tâche sans suspendre, ni mettre fin à la transaction.
UserTransaction , qui s'en occupe automatiquement. Si tel est le cas, il y a peut-être un problème dans le framework.
TransactionManager ou Transactions directement, considérez le comportement suivant lors de la validation ou de l'annulation d'une transaction. Si votre code utilise les méthodes du TransactionManager pour contrôler vos transactions, la validation ou l'annulation d'une transaction dissociera la transaction du thread actuel. Toutefois, si votre code utilise les méthodes Transaction , la transaction peut ne pas être associée au thread en cours d'exécution, et il faudra la dissocier de son thread manuellement, avant de la retourner au pool de threads.
Cette erreur a lieu si vous essayez d'enlister une seconde ressource non-XA dans une transaction. Si vous avez besoin de ressources multiples pour une transaction, elles doivent être XA.
11.8. Configuration ORB Copier lienLien copié sur presse-papiers!
11.8.1. CORBA (Common Object Request Broker Architecture) Copier lienLien copié sur presse-papiers!
11.8.2. Configurer l'ORB pour les transactions JTS Copier lienLien copié sur presse-papiers!
Note
full et full-ha uniquement. Dans un serveur autonome, il est disponible uniquement quand vous utilisez les configurations standalone-full.xml ou standalone-full-ha.xml.
Procédure 11.6. Configurer l'ORB par la console de gestion
Voir les paramètres de configuration du profil.
Sélectionner Configuration dans la partie supérieure de la console de gestion. Si vous utilisez un domaine géré, sélectionner soit le profil full ou full-ha à partir de la boîte de dialogue de sélection en haut à gauche.Modifier les paramètres Initializers
Étendre sur le menu Subsystems. Étendre le menu Container, et sélectionner JacORB.Sur le formulaire qui apparaît sur l'écran principal, sélectionner l'onglet Initializers, et cliquer sur le bouton Edit.Activer les intercepteurs de sécurité en configurant la valeur de Security àactive.Pour activer ORB sur JTS, définir la valeur des Transaction Interceptorss àactive, au lieu de la valeur par défautspec.Voir le lien Need Help? sur le formulaire pour accéder à des explications sur ces valeurs. Cliquer sur Save quand vous aurez fini de modifier les valeurs.Configuration ORB avancée
Voir les autres sections du formulaire pour les options de configuration avancées. Chaque section inclut un lien Need Help? avec des informations détaillées sur les paramètres.
Vous pouvez configurer chaque aspect de l'ORB à l'aide de l'interface CLI. Les commandes suivantes configurent les initialisateurs aux mêmes valeurs que celles de la procédure ci-dessus, pour la console de gestion. Il s'agit de la configuration minimale pour l'ORB, si utilisé avec JTS.
/profile=full des commandes.
Exemple 11.4. Activer les intercepteurs de sécurité
/profile=full/subsystem=jacorb/:write-attribute(name=security,value=on)
/profile=full/subsystem=jacorb/:write-attribute(name=security,value=on)
Exemple 11.5. Activer les transactions dans le sous-système JacORB
/profile=full/subsystem=jacorb/:write-attribute(name=transactions,value=on)
/profile=full/subsystem=jacorb/:write-attribute(name=transactions,value=on)
Exemple 11.6. Activer JTS dans le sous-système de transactions
/profile=full/subsystem=transactions:write-attribute(name=jts,value=true)
/profile=full/subsystem=transactions:write-attribute(name=jts,value=true)
Note
11.9. Références de transactions Copier lienLien copié sur presse-papiers!
11.9.1. Erreurs et exceptions pour les transactions JBoss Copier lienLien copié sur presse-papiers!
UserTransaction, voir la spécification UserTransaction API dans http://docs.oracle.com/javaee/6/api/javax/transaction/UserTransaction.html.
11.9.2. Exemple de transaction JTA Copier lienLien copié sur presse-papiers!
Exemple 11.7. Exemple de transaction JTA
11.9.3. Documentation API pour JBoss Transactions JTA Copier lienLien copié sur presse-papiers!
11.9.4. Limitations dans le processus de recouvrement XA Copier lienLien copié sur presse-papiers!
- Le journal de transactions
- Si le serveur JBoss EAP échoue après qu'une méthode de validation
XAResourceréussisse et validifie la transaction, mais avant que le coordinateur puisse mettre le journal à jour, vous verrez sans doute le message suivant apparaître dans le journal quand vous démarrerez le serveur à nouveau :C'est parce que lors de la restauration, le gestionnaire de transactions de JBoss (JBoss Transaction Manager) voit les participants à la transaction dans le journal et tente la validation à nouveau. Ensuite, le gestionnaire de transactions de JBoss suppose que les ressources sont validées et ne tente plus de valider à nouveau. Dans ce cas, il est possible d'ignorer cet avertissement car la transaction est validée et il n'y a aucune perte de données.ARJUNA016037: Could not find new XAResource to use for recovering non-serializable XAResource XAResourceRecord
ARJUNA016037: Could not find new XAResource to use for recovering non-serializable XAResource XAResourceRecordCopy to Clipboard Copied! Toggle word wrap Toggle overflow Pour éviter cet avertissement, définir la valeur de la propriété com.arjuna.ats.jta.xaAssumeRecoveryComplete àtrue. Cette propriété est vérifiée à chaque fois qu'une nouvelle instance deXAResourcene peut pas être trouvée parmi lesXAResourceRecoveryenregistrées. Si défini surtrue, le recouvrement assume que les tentatives précédentes ont réussi, et l'instance peut être supprimée du journal sans besoin de nouvelle tentative. Cette propriété doit être utilisée avec soin car elle est globale et si elle est utilisée par de façon erronée, on se retrouve avec des instancesXAResourcerestantes non validées. - La restauration n'est pas automatique pour les transactions JTS qui suivent un plantage de serveur à la fin de XAResource.prepare().
- Si le serveur JBoss EAP se plante suite à un appel de méthode
XAResourceprepare(), tous les participants à XAResources sont verrouillés dans l'état « prepared » et y demeurent lors du redémarrage du serveur. La transaction n'est pas restaurée et les ressources restent verrouillées jusqu'à ce que l'opération arrive à expiration ou qu'un DBA restaure les ressources et efface les transactions du journal manuellement. - Le recouvrement périodique peut avoir lieu sur des transactions déjà validées.
- Quand le serveur est sous charge intensive, le journal du serveur peut contenir les messages d'avertissement suivants, suivis d'un stackstace :
ARJUNA016027: Local XARecoveryModule.xaRecovery got XA exception XAException.XAER_NOTA: javax.transaction.xa.XAException
ARJUNA016027: Local XARecoveryModule.xaRecovery got XA exception XAException.XAER_NOTA: javax.transaction.xa.XAExceptionCopy to Clipboard Copied! Toggle word wrap Toggle overflow Sous forte charge, le temps de traitement pris par une transaction peut chevaucher le calendrier d'activité de la procédure de restauration périodique. Le processus de restauration périodique détecte la transaction en cours d'exécution et essaie d'initier une restauration, mais en fait, la transaction se poursuit jusqu'à la fin. Au moment où le processus de restauration périodique tente mais échoue à la restauration, il enregistre l'échec de restauration dans le journal de serveur. La cause sous-jacente de cette question sera abordée dans une prochaine version, mais en attendant, une solution de contournement est disponible.Augmenter l'intervalle entre les deux phases du processus de restauration en définissant la propriété com.arjuna.ats.jta.orphanSafetyInterval sur une valeur supérieure à la valeur par défaut de 10 000 millisecondes. Une valeur de 40 000 millisecondes est recommandée. Veuillez noter que cela ne résout pas le problème, au contraire, cela diminue la probabilité qu'il se produira et que le message d'avertissement s'affichera dans le journal.
Chapitre 12. Hibernate Copier lienLien copié sur presse-papiers!
12.1. Hibernate Core Copier lienLien copié sur presse-papiers!
12.2. Java Persistence API (JPA) Copier lienLien copié sur presse-papiers!
12.2.1. JPA Copier lienLien copié sur presse-papiers!
bean-validation, greeter, et kitchensink : Section 1.4.1.1, « Accès aux Quickstarts ».
12.2.2. Hibernate EntityManager Copier lienLien copié sur presse-papiers!
12.2.3. Guide de départ Copier lienLien copié sur presse-papiers!
12.2.3.1. Créer un projet JPA dans le Red Hat JBoss Developer Studio Copier lienLien copié sur presse-papiers!
Cet exemple indique les étapes à effectuer pour créer un projet JPA dans Red Hat JBoss Developer Studio.
Procédure 12.1. Créer un projet JPA dans le Red Hat JBoss Developer Studio
- Dans la fenêtre Red Hat JBoss Developer Studio, cliquez sur → → . Trouvez JPA dans la liste, étendez-la et sélectionnez JPA Project. La boîte de dialogue suivante s'affichera.
- Saisissez un Project name.
- Sélectionnez un Target runtime. Si aucun target runtime n'est disponible, suivez ces instructions pour définir un nouveau serveur et runtime : Section 1.3.1.5, « Ajouter le serveur de JBoss EAP en utilisant Define New Server ».
- Sous JPA version, assurez-vous que 2.1 est sélectionné.
- Sous Configuration, choisissez Basic JPA Configuration.
- Cliquer sur .
- Si cela vous est demandé, choisissez si vous souhaitez associer ce type de projet à la fenêtre de perspective JPA.
12.2.3.2. Créer le fichier de paramètres de persistance dans Red Hat JBoss Developer Studio Copier lienLien copié sur presse-papiers!
Cette section couvre le processus de création du fichier persistence.xml dans un projet Java qui utilise Red Hat JBoss Developer Studio.
Conditions préalables
Procédure 12.2. Créer et configurer un nouveau fichier de configuration de persistance
- Ouvrir un projet EJB 3.x dans Red Hat JBoss Developer Studio.
- Cliquer à droite sur le répertoire racine du projet dans le panneau Project Explorer
- Sélectionner → .
- Sélectionner XML File à partir du dossier XML et cliquer sur .
- Sélectionner le dossier
ejbModule/META-INFcomme répertoire parent. - Nommer le fichier
persistence.xmlet cliquer sur . - Sélectionner Create XML file from an XML schema file (créer fichier à partir d'un fichier xml) et cliquer sur .
- Sélectionner http://java.sun.com/xml/ns/persistence/persistence_2.0.xsd dans la liste Select XML Catalog entry et cliquer sur .
- Cliquer sur pour créer le fichier.
- Résultat :
- Le fichier
persistence.xmla été créé dans le dossierMETA-INF/et est prêt pour la configuration. Un exemple de fichier se trouve ici : Section 12.2.3.3, « Exemple de fichier de configuration de persistance »
12.2.3.3. Exemple de fichier de configuration de persistance Copier lienLien copié sur presse-papiers!
Exemple 12.1. persistence.xml
12.2.3.4. Créer le fichier de configuration Hibernate dans Red Hat JBoss Developer Studio Copier lienLien copié sur presse-papiers!
Conditions préalables
Ce sujet couvre le processus de création du fichier hibernate.cfg.xml dans un projet Java qui utilise Red Hat JBoss Developer Studio.
Procédure 12.3. Créer un nouveau fichier de configuration Hibernate
- Ouvrir un projet Java dans Red Hat JBoss Developer Studio
- Cliquer à droite sur le répertoire racine du projet dans le panneau Project Explorer
- Sélectionner → .
- Sélectionner Hibernate Configuration File depuis le dossier Hibernate et cliquer sur .
- Sélectionner le répertoire
src/et cliquer sur . - Configurer :
- Nom de la fabrique à sessions
- Dialecte de base de données
- Classe pilote
- URL de connexion
- Nom d'utilisateur
- Mot de passe
- Cliquer sur pour créer le fichier.
- Résultat :
- Le fichier
hibernate.cfg.xmla été créé dans le dossiersrc/. Un exemple de fichier est disponible ici : Section 12.2.3.5, « Exemple de fichier de configuration Hibernate ».
12.2.3.5. Exemple de fichier de configuration Hibernate Copier lienLien copié sur presse-papiers!
Exemple 12.2. hibernate.cfg.xml
12.2.4. Configuration Copier lienLien copié sur presse-papiers!
12.2.4.1. Propriétés de configuration de Hibernate Copier lienLien copié sur presse-papiers!
| Nom de propriété | Description |
|---|---|
| hibernate.dialect |
Le nom de classe d'un
org.hibernate.dialect.Dialect Hibernate. Permet à Hibernate de générer SQL optimisé pour une base de données relative particulière.
Dans la plupart des cas, Hibernate pourra choisir la bonne implémentation de
org.hibernate.dialect.Dialect, selon les JDBC metadata renvoyées par le pilote JDBC.
|
| hibernate.show_sql |
Booléen. Écrit toutes les déclarations SQL à la console. C'est une alternative pour définir la catégorie du journal
org.hibernate.SQL sur debug.
|
| hibernate.format_sql |
Booléen. Mettre en forme le SQL dans le journal et la console.
|
| hibernate.default_schema |
Qualifie les noms de tableaux non qualifiés avec le schéma/espace tableau donné dans le SQL généré.
|
| hibernate.default_catalog |
Qualifie les noms de tableaux non qualifiés avec le catalogue donné dans le SQL généré.
|
| hibernate.session_factory_name |
Le
org.hibernate.SessionFactory sera automatiquement lié à ce nom dans JNDI après avoir été créé. Par exemple, jndi/composite/name.
|
| hibernate.max_fetch_depth |
Définit une "profondeur" maximum pour l'arborescence de récupération de la jointure externe pour les associations à fin unique (un-à-un, plusieurs-à-un). Un
0 désactive la récupération de jointure externe par défaut. La valeur recommandée se situe entre 0 et 3.
|
| hibernate.default_batch_fetch_size |
Définit une taille par défaut pour la récupération en lot d'associations de Hibernate. Les valeurs recommandées sont
4, 8, et 16.
|
| hibernate.default_entity_mode |
Définit un mode par défaut pour la réprésentation d'entité pour toutes les sessions ouvertes à partir de
SessionFactory. Les valeurs comprennent : dynamic-map, dom4j, pojo.
|
| hibernate.order_updates |
Booléen. Oblige Hibernate à ordonner les mises à jour SQL par la valeur clé principale des éléments mis à jour. Cela se traduira en un nombre inférieur de blocages de transactions dans des systèmes hautement simultanés.
|
| hibernate.generate_statistics |
Booléen. Si autorisé, Hibernate va collecter les statistiques utiles pour le réglage de performance.
|
| hibernate.use_identifier_rollback |
Booléen. Si autorisé, les propriétés d'identifiant générées seront restaurées à leur valeur par défaut lorsque les objets sont supprimés.
|
| hibernate.use_sql_comments |
Booléen. Si activé, Hibernate génèrera des commentaires à l'intérieur de SQL, pour faciliter de débogage. La valeur par défaut est
false.
|
| hibernate.id.new_generator_mappings |
Booléen. Cette propriété est appropriée lorsque
@GeneratedValue est utilisée. Elle indique si les nouvelles implémentations IdentifierGenerator sont utilisées pour javax.persistence.GenerationType.AUTO, javax.persistence.GenerationType.TABLE et javax.persistence.GenerationType.SEQUENCE. La valeur par défaut est true.
|
| hibernate.ejb.naming_strategy |
Sélectionne l'implémentation
org.hibernate.cfg.NamingStrategy avec Hibernate EntityManager. Cette classe est dépréciée et cette propriété n'est fournie que pour la compatibilité rétroactive. Cette propriété doit être utilisée avec hibernate.ejb.naming_strategy_delegator.
Si l'application n'utilise pas EntityManager, suivre les instructions suivantes pour configurer la NamingStrategy: Hibernate Reference Documentation - Implementing a Naming Strategy.
|
| hibernate.ejb.naming_strategy_delegator |
Indique une implémentation
org.hibernate.cfg.naming.NamingStrategyDelegatator pour les objets de base de données et les éléments de schéma avec un Entity Manager Hibernate. Cette propriété peut comporter les valeurs suivantes.
Note
Cette propriété ne peut pas être utilisée avec hibernate.ejb.naming_strategy. C'est un remplacement temporaire de org.hibernate.cfg.NamingStrategy pour pallier à ses limitations. Nous envisageons une solution plus complète pour Hibernate 5.0 qui remplacera à la fois org.hibernate.cfg.NamingStrategy et org.hibernate.cfg.naming.NamingStrategyDelegator.
Si l'application n'utilise pas EntityManager, suivre les instructions suivantes pour configurer la NamingStrategy: Hibernate Reference Documentation - Implementing a Naming Strategy.
|
Important
hibernate.id.new_generator_mappings, les nouvelles applications devront garder la valeur par défaut true. Les applications existantes qui utilisent Hibernate 3.3.x devront sans doute modifier cette valeur à false pour continuer à utiliser un objet de séquence ou un générateur basé-table et pour maintenir la compatibilité rétro-active.
12.2.4.2. Hibernate JDBC et Propriétés de Connexion Copier lienLien copié sur presse-papiers!
| Nom de propriété | Description |
|---|---|
| hibernate.jdbc.fetch_size |
Valeur non nulle qui détermine la taille de récupération JDBC (appelle
Statement.setFetchSize()).
|
| hibernate.jdbc.batch_size |
Une valeur non nulle active l'utilisation des mises à jour de lots de JDBC2 par Hibernate. Les valeurs recommandées se situent entre
5 et 30.
|
| hibernate.jdbc.batch_versioned_data |
Booléen. Définir cette propriété sur
true si le pilote JDBC renvoie des nombres de lignes corrects avec executeBatch(). Hibernate utilisera ensuite un DML en lot pour les données versionnées automatiquement. La valeur par défaut est false.
|
| hibernate.jdbc.factory_class |
Sélectionner un
org.hibernate.jdbc.Batcher personnalisé. La plupart des applications n'auront pas besoin de cette propriété de configuration.
|
| hibernate.jdbc.use_scrollable_resultset |
Booléen. Active l'utilisation des ensembles de résultats déroulants de JDBC2 par Hibernate. Cette propriété n'est nécessaire que lorsque l'on utilise des connexions JDBC fournies par l'utilisateur. Sans quoi, Hibernate utilise des métadonnées de connexion.
|
| hibernate.jdbc.use_streams_for_binary |
Booléen. Ceci est une propriété de niveau système. Utiliser les flux lors de l'écriture/la lecture de types
binary ou serializable depuis/vers JDBC.
|
| hibernate.jdbc.use_get_generated_keys |
Booléen. Active l'utilisation de JDBC3
PreparedStatement.getGeneratedKeys() pour récupérer les cléfs générées en mode natif après insertion. Requiert le pilote JDBC3+ et JRE1.4+. Défini sur false si le pilote JDBC rencontre des problèmes avec les générateurs d'identifiants Hibernate. Par défaut, il tente de déterminer les capacités du pilote en utilisant les métadonnées de connexion.
|
| hibernate.connection.provider_class |
Le nom de classe d'un
org.hibernate.connection.ConnectionProvider personnalisé qui fournit des connexions JDBC à Hibernate.
|
| hibernate.connection.isolation |
Définit le niveau d'isolation des transactions JDBC. Vérifier
java.sql.Connection pour des valeurs compréhensibles, mais veuillez noter que la plupart des bases de données ne prennent pas en charge tous les niveaux d'isolation et que quelques unes définissent des isolations additionnelles, non-standard. Les valeurs standard sont 1, 2, 4, 8.
|
| hibernate.connection.autocommit |
Booléen. Cette propriété n'est pas recommandée à l'utilisation. Active l'autovalidation pour les connexions « en commun » de JDBC.
|
| hibernate.connection.release_mode |
Indique à quel moment Hibernate devra diffuser les connexions JDBC. Par défaut, une connexion JDBC est maintenue jusqu'à ce que la session soit explicitement fermée ou déconnectée. La valeur par défaut
auto choisira after_statement pour les stratégies de transaction JTA et CMT, et after_transaction pour la stratégie de transaction JDBC.
Les valeurs disponibles sont
auto (par défaut) | on_close | after_transaction | after_statement.
Ce paramètre n'affecte que les
Sessions renvoyées depuis SessionFactory.openSession. Pour les Sessions obtenues par SessionFactory.getCurrentSession, l'implémentation CurrentSessionContext configurée pour l'utilisation contrôle le mode de publication de connexion pour ces Sessions.
|
| hibernate.connection.<propertyName> |
Passer la propriété JDBC <propertyName> à
DriverManager.getConnection().
|
| hibernate.jndi.<propertyName> |
Passer la proriété <propertyName> à
InitialContextFactory de JNDI.
|
12.2.4.3. Propriétés d'Hibernate Cache Copier lienLien copié sur presse-papiers!
| Nom de propriété | Description |
|---|---|
hibernate.cache.region.factory_class |
Le nom de classe d'un
CacheProvider personnalisé.
|
hibernate.cache.use_minimal_puts |
Booléen. Optimise l'opération cache de second niveau pour minimiser les écritures, au détriment de lectures plus fréquentes. Cette configuration est surtout utile pour les caches clusterisés et, dans Hibernate 3, est activée par défaut pour les implémentations cache clusterisées.
|
hibernate.cache.use_query_cache |
Booléen. Active le cache de recherche. Les recherches individuelles doivent toujours être définies comme cachables.
|
hibernate.cache.use_second_level_cache |
Booléen. Utilisé pour désactiver totalement le cache de second niveau, qui est activé par défaut pour les classes qui spécifient un mappage
<cache>.
|
hibernate.cache.query_cache_factory |
Le nom de classe d'une interface
QueryCache personnalisée. La valeur par défaut est le StandardQueryCache intégré.
|
hibernate.cache.region_prefix |
Un préfixe à utiliser pour les noms régionaux de cache de second niveau.
|
hibernate.cache.use_structured_entries |
Booléen. Force Hibernate à stocker des données dans un cache de second niveau dans un format plus amical pour l'utilisateur.
|
hibernate.cache.default_cache_concurrency_strategy |
Configuration utilisée pour donner le nom de la statégie qu'il faut
org.hibernate.annotations.CacheConcurrencyStrategy quand @Cacheable ou @Cache sont utilisés. @Cache(strategy="..") est utilisé pour remplacer cette valeur par défaut.
|
12.2.4.4. Propriétés de transaction Hibernate Copier lienLien copié sur presse-papiers!
| Nom de propriété | Description |
|---|---|
hibernate.transaction.factory_class |
Le nom de classe d'une
TransactionFactory à utiliser avec l'API de Transaction de Hibernate. Valeur par défaut : JDBCTransactionFactory.
|
jta.UserTransaction |
Un nom JNDI utilisé par
JTATransactionFactory pour obtenir la UserTransaction JTA depuis le serveur d'applications.
|
hibernate.transaction.manager_lookup_class |
Le nom de classe d'une
TransactionManagerLookup. Requis lorsque la mise en cache de niveau JVM est activée ou lorsque le générateur hilo est utilisé dans un environnement JTA.
|
hibernate.transaction.flush_before_completion |
Booléen. Si activé, la session sera automatiquement vidée avant la phase d'achèvement de la transaction. Une gestion de contexte de session automatique et intégrée est préférée.
|
hibernate.transaction.auto_close_session |
Booléen. Si activé, la session sera automatiquement fermée après la phase d'achèvement de la transaction. Une gestion de contexte de session automatique et intégrée est préférable.
|
12.2.4.5. Propriétés Hibernate diverses Copier lienLien copié sur presse-papiers!
| Nom de propriété | Description |
|---|---|
hibernate.current_session_context_class |
Fournit une stratégie personnalisée pour l'étendue de la
Session « actuelle ». Les valeurs comprennent jta | thread | managed | custom.Class.
|
hibernate.query.factory_class |
Choisir l'implémentation de l'analyseur de HQL :
org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory ou org.hibernate.hql.internal.classic.ClassicQueryTranslatorFactory.
|
hibernate.query.substitutions |
Utilisé pour mapper à partir de jetons dans les requêtes Hibernate aux jetons SQL (les jetons peuvent avoir un nom fonctionnel ou littéral). Par exemple,
hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC.
|
hibernate.hbm2ddl.auto |
Valide ou exporte automatiquement le schéma DDL vers la base de données quand la
SessionFactory est créée. Avec create-drop, le schéma de base de données sera déposé lorsque la SessionFactory est fermée explicitement. Les options de valeur de propriété sont validate | update | create | create-drop
|
hibernate.hbm2ddl.import_files |
Les noms séparés par des virgules des fichiers optionnels contenant des déclarations SQL DML exécutées pendant la création de
SessionFactory. Cela est utile pour tester ou démontrer. Par exemple, en ajoutant des déclarations INSERT, la base de données peut être remplie avec un lot minimum de données quand elle est déployée. Exemple de valeur : /humans.sql,/dogs.sql.
L'ordre de fichier compte, puisque les déclarations d'un fichier donné sont exécutées avant la déclaration du fichier suivant. Ces déclarations ne sont exécutées que si le schéma est créé (c'est-à-dire si
hibernate.hbm2ddl.auto est défini comme create ou create-drop).
|
hibernate.hbm2ddl.import_files_sql_extractor |
Le nom de classe d'un
ImportSqlCommandExtractor personnalisé. Valeur par défaut de SingleLineSqlCommandExtractor intégré. Cela est utile pour implémenter un analyseur dédié qui extrait une déclaration unique de SQL depuis chaque fichier d'importation. Hibernate fournit également MultipleLinesSqlCommandExtractor, qui prend en charge des instructions/commentaires et des chaînes citées réparties sur de multiples lignes (point-virgule obligatoire à la fin de chaque déclaration).
|
hibernate.bytecode.use_reflection_optimizer |
Booléen. Ceci est une propriété de niveau système, qui ne peut pas être définie dans le fichier
hibernate.cfg.xml. Elle permet l'utilisation de la manipulation bytecode au lieu de la réflexion d'exécution. La réflexion peut parfois être utile lors de la résolution de problèmes. Hibernate requiert toujours soit CGLIB ou javassist même si l'optimizer est éteint.
|
hibernate.bytecode.provider |
Javassist et cglib peuvent tous les deux être utilisés comme moteurs de manipulation de byte. La valeur par défaut est
javassist. La valeur de propriété est soit javassist soit cglib.
|
12.2.4.6. Dialectes SQL Hibernate Copier lienLien copié sur presse-papiers!
Important
hibernate.dialect devrait être définie sur la sous-classe org.hibernate.dialect.Dialect correcte pour la base de données de l'application. Si un dialecte est indiqué, Hibernate utilisera des valeurs par défaut raisonnables pour quelques unes des autres propriétés. Cela signifie qu'elles n'ont pas besoin d'être spécifiées manuellement.
| RDBMS | Dialecte |
|---|---|
| DB2 | org.hibernate.dialect.DB2Dialect |
| DB2 AS/400 | org.hibernate.dialect.DB2400Dialect |
| DB2 OS390 | org.hibernate.dialect.DB2390Dialect |
| Firebird | org.hibernate.dialect.FirebirdDialect |
| FrontBase | org.hibernate.dialect.FrontbaseDialect |
| H2 Database | org.hibernate.dialect.H2Dialect |
| HypersonicSQL | org.hibernate.dialect.HSQLDialect |
| Informix | org.hibernate.dialect.InformixDialect |
| Ingres | org.hibernate.dialect.IngresDialect |
| Interbase | org.hibernate.dialect.InterbaseDialect |
| Mckoi SQL | org.hibernate.dialect.MckoiDialect |
| Microsoft SQL Server 2000 | org.hibernate.dialect.SQLServerDialect |
| Microsoft SQL Server 2005 | org.hibernate.dialect.SQLServer2005Dialect |
| Microsoft SQL Server 2008 | org.hibernate.dialect.SQLServer2008Dialect |
| Microsoft SQL Server 2012 | org.hibernate.dialect.SQLServer2008Dialect |
| MySQL5 | org.hibernate.dialect.MySQL5Dialect |
| MySQL5 avec InnoDB | org.hibernate.dialect.MySQL5InnoDBDialect |
| MySQL avec MyISAM | org.hibernate.dialect.MySQLMyISAMDialect |
| Oracle (toute version) | org.hibernate.dialect.OracleDialect |
| Oracle 9i | org.hibernate.dialect.Oracle9iDialect |
| Oracle 10g | org.hibernate.dialect.Oracle10gDialect |
| Oracle 11g | org.hibernate.dialect.Oracle10gDialect |
| Pointbase | org.hibernate.dialect.PointbaseDialect |
| PostgreSQL | org.hibernate.dialect.PostgreSQLDialect |
| PostgreSQL 9.2 | org.hibernate.dialect.PostgreSQL82Dialect |
| Postgres Plus Advanced Server | org.hibernate.dialect.PostgresPlusDialect |
| Progress | org.hibernate.dialect.ProgressDialect |
| SAP DB | org.hibernate.dialect.SAPDBDialect |
| Sybase | org.hibernate.dialect.SybaseASE15Dialect |
| Sybase 15.7 | org.hibernate.dialect.SybaseASE157Dialect |
| Sybase Anywhere | org.hibernate.dialect.SybaseAnywhereDialect |
12.2.5. Caches de second niveau Copier lienLien copié sur presse-papiers!
12.2.5.1. Les caches de second niveau Copier lienLien copié sur presse-papiers!
- Web Session Clustering
- Stateful Session Bean Clustering
- SSO Clustering
- Cache de second niveau d'Hibernate
12.2.5.2. Configurer un cache de second niveau pour Hibernate Copier lienLien copié sur presse-papiers!
Procédure 12.4. Créer et modifier le fichier hibernate.cfg.xml
Créer le fichier hibernate.cfg.xml
Créer le fichierhibernate.cfg.xmldans le chemin de classe du déploiement. Pour plus de détails, voir Section 12.2.3.4, « Créer le fichier de configuration Hibernate dans Red Hat JBoss Developer Studio » .- Ajouter ces lignes d'XML au fichier
hibernate.cfg.xmlde votre application. Le XML doit être à l'intérieur des balises <session-factory>:<property name="hibernate.cache.use_second_level_cache">true</property> <property name="hibernate.cache.use_query_cache">true</property>
<property name="hibernate.cache.use_second_level_cache">true</property> <property name="hibernate.cache.use_query_cache">true</property>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Ajouter un élément ci-dessous à la section <session-factory> de votre fichier
hibernate.cfg.xml:Si le CacheManager Infinispan est lié au JNDI :
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Si le CacheManager Infinispan est autonome :
<property name="hibernate.cache.region.factory_class"> org.hibernate.cache.infinispan.InfinispanRegionFactory </property><property name="hibernate.cache.region.factory_class"> org.hibernate.cache.infinispan.InfinispanRegionFactory </property>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Infinispan est configuré au second niveau de cache dans Hibernate.
12.3. Annotations Hibernate Copier lienLien copié sur presse-papiers!
12.3.1. Annotations Hibernate Copier lienLien copié sur presse-papiers!
| Annotation | Description |
|---|---|
| AccessType | Type d'accès de propriété |
| Tous | Définit une association ToOne pointant vers plusieurs types d'entités. L'association du type d'entité correspondant se fait à travers une colonne discriminatoire de métadonnées. Ce type de mappage devrait seulement être marginal. |
| AnyMetaDef | Définit les métadonnées @Any et @ManyToAny. |
| AnyMedaDefs | Définit les ensembles de métadonnées @Any et @ManyToAny. Peut être défini au niveau d'entité ou de paquetage. |
| BatchSize | Taille de lot pour chargement SQL. |
| Cache | Ajouter une stratégie de mise en cache à une entité root ou une collection. |
| Cascade | Appliquer une stratégie de cascade sur une association |
| Check | Contraintes de vérification SQL arbitraires qui peuvent être définies aux niveaux de classe, de propriété ou de collection. |
| Columns | Prend en charge une gamme de colonnes. Utile pour les mappages de type utilisateur de composant. |
| ColumnTransformer | Expression SQL personnalisée utilisée pour lire la valeur depuis et écrire une valeur vers une colonne. Utiliser pour le chargement/enregistrement d'objet direct ainsi que les requêtes. L'expression de lecture doit contenir exactement un "?" pour la valeur. |
| ColumnTransformers | Annotation plurielle pour @ColumnTransformer. Utile lorsque plus d'une colonne utilise ce comportement. |
| DiscriminatorFormula | Formule discriminatoire à placer à l'entité de root. |
| DiscriminatorOptions | Annotation optionnelle pour exprimer les propriétés discriminatoires spécifiques à Hibernate. |
| Entity | Prolonge l'entité avec les caractéristiques Hibernate. |
| Fetch | Définit la stratégie de récupération utilisée pour l'association donnée. |
| FetchProfile | Définit le profil de stratégie de récupération |
| FetchProfiles | Annotation plurielle pour @FetchProfile. |
| Filter | Ajoute des filtres à une entité ou une entité de cible d'une collection. |
| FilterDef | Définition de Filtre. |
| FilterDefs | Gamme de définitions de filtre. |
| FilterJoinTable | Ajoute des filtres pour une collection rejoindre une table |
| FilterJoinTables | Ajoute de multiples @FilterJoinTable à une collection |
| Filters | Ajoute de multiples @Filters. |
| Formula | A utiliser comme remplacement pour @Column dans la plupart des emplacements. La formule doit être un fragment SQL valide. |
| Generated | Cette propriété annotée est générée par la base de données. |
| GenericGenerator | Annotation de générateur décrivant toute sorte de générateur Hibernate d'une manière non-typée. |
| GenericGenerators | Gamme de définitions de générateur génériques. |
| Immutable |
Marque une Entité ou une Collection comme immuable. Si aucune annotation, l'élément est mutable.
Une entité immuable peut ne pas être mise à jour par l'application. Les mises à jour vers une entité immuable seront ignorées, mais aucune exception ne sera levée.
Placer @Immutable sur une collection rend la collection immuable, ce qui signifie que les additions et suppressions vers et depuis la collection ne sont pas autorisées. Une HibernateException est levée dans ce cas.
|
| Index | Définit un indice de base de données. |
| JoinFormula | A utiliser comme remplacement pour @JoinColumn dans la plupart des emplacements. La formule doit être un fragment SQL valable. |
| LazyCollection | Définit le statut lazy d'une collection |
| LazyToOne | Définit le statut lazy d'une association ToOne (c'est-à-dire OneToOne or ManyToOne). |
| Loader | Ecrase la méthode FIND par défaut de Hibernate. |
| ManyToAny | Définit une association ToMany en indiquant différent types d'entité. L'association du type d'entité correspondant se fait à travers une colonne discriminatoire de métadonnées. Ce type de mappage devrait seulement être marginal. |
| MapKeyType | Définit le type de clé d'une mappe persistante. |
| MetaValue | Représente une valeur discriminatoire associée à un type d'entité donné. |
| NamedNativeQueries | Prolonge les NamedNativeQueries pour maintenir les objets NamedNativeQuery de Hibernate. |
| NamedNativeQuery | Prolonge la NamedNativeQuery avec les caractéristiques Hibernate. |
| NamedQueries | Etend les NamedQueries pour maintenir les objets NamedQuery de Hibernate. |
| NamedQuery | Prolonge NamedQuery avec les caractéristiques Hibernate. |
| IdNaturel | Indique que la propriété fait partie de l'identifiant naturel de l'entité. |
| NotFound | Action à accomplir lorsqu'un élément est introuvable dans une association. |
| OnDelete | Stratégie à utiliser pour la suppression de collections, de tableaux ou de sous-classes jointes. OnDelete des tableaux secondaires n'est pas actuellement pris en charge. |
| OptimisticLock | Indique si une modification de la propriété annotée déclenchera une incrémentation de version d'entité. Si l'annotation n'est pas présente, la propriété est impliquée dans la stratégie de verrouillage optimiste (par défaut). |
| OptimisticLocking | Utilisé pour définir le style de verrouillage optimiste à appliquer à une entité. Dans une hiérarchie, seulement valide sur l'entité de root. |
| OrderBy | Ordonne une collection en utilisant l'ordre SQL (pas l'ordre HSL). |
| ParamDef | Une définition de paramètre. |
| Paramètre | Modèle clé/valeur |
| Parent | Renvoie la référence de la propriété en tant que pointeur vers le propriétaire (en général l'entité propriétaire). |
| Persister | Indique un persister personnalisé |
| Polymorphisme | Utilisé pour définir le type de polymorphisme qu'Hibernate appliquera aux hiérarchies d'entité. |
| Proxy | Configuration proxy et lazy d'une classe particulière. |
| RowId | Prend en charge les caractéristiques de mappage ROWID de Hibernate |
| Tri | Tri de collection (tri de niveau Java). |
| Source | Annotation optionnelle conjointement avec les propriétés de Version et de version Timestamp. La valeur d'annotation décide de l'endroit où timestamp est généré. |
| SQLDelete | Ecrase la méthode DELETE par défaut de Hibernate. |
| SQLDeleteAll | Ecrase la méthode DELETE ALL par défaut de Hibernate. |
| SQLInsert | Remplace la méthode INSERT INTO par défaut de Hibernate. |
| SQLUpdate | Remplace la méthode UPDATE par défaut de Hibernate. |
| Subselect | Mappe une entité immuable et en lecture seule vers une expression sous-sélection SQL donnée. |
| Synchronize | S'assure qu'auto-flush fonctionne correctement et que les requêtes concernant l'entité dérivée ne renvoient pas des données obsolètes. Principalement utilisé avec Subselect. |
| Table | Information complémentaire d'une table primaire ou secondaire |
| Tables | Annotation plurielle de Table |
| Cible | Définit une source explicite et évite la résolution de réflexion et de génériques. |
| Tuplizer | Définit un tuplizer pour une entité ou un composant. |
| Tuplizers | Définit un ensemble de tuplizers pour une entité ou un composant. |
| Type | Type Hibernate. |
| TypeDef | Définition d'un type Hibernate |
| TypeDefs | Gamme de définition de Type Hibernate |
| Where | Clause Where à ajouter à l'élément Entité ou entité de cible d'une collection. La clause est écrite en SQL. |
| WhereJoinTable | Clause Where à ajouter à la collection joindre une table. La clause est écrite en SQL. |
Note
12.4. Langage de recherche Hibernate Copier lienLien copié sur presse-papiers!
12.4.1. Langage de recherche d'Hibernate Copier lienLien copié sur presse-papiers!
12.4.2. Déclarations HQL Copier lienLien copié sur presse-papiers!
SELECT, UPDATE, DELETE, et INSERT. La déclaration INSERT de HQL n'a pas d'équivalent dans JPQL.
Important
UPDATE ou DELETE est exécutée.
| Déclaration | Description |
|---|---|
SELECT |
Le BNF pour les déclarations
SELECT dans HQL est :
La déclaration
SELECT de HQL la plus simple qui soit est sous la forme :
de com.acme.Cat
|
UDPATE | Le BNF pour la déclaration UPDATE dans HQL est le même que dans JPQL. |
DELETE | Le BNF pour les déclarations DELETE dans HQL est le même que dans JPQL. |
12.4.3. La déclaration INSERT Copier lienLien copié sur presse-papiers!
INSERT. Il n'existe pas d'équivalent JPQL. Le BNF d'une déclaration INSERT HQL est :
attribute_list est analogue à la column specification dans la déclaration INSERT de SQL. Pour les entités impliquées dans un héritage mappé, seuls les attributs définis directement sur l'entité nommée peuvent être utilisés dans la attribute_list. Les propriétés de sur-classe ne sont pas autorisées et les propriétés de sous-classe sont inutiles. En d'autres termes, les déclarations INSERT sont, par nature, non-polymorphes.
Avertissement
select_statement peut être n'importe quelle requête sélectionnée HQL valide, avec l'avertissement que les types de renvoi doivent correspondre aux types attendus par l'insertion. Actuellement, cela est vérifié lors de la compilation de requêtes plutôt que de permettre une vérification reléguée à la base de données. Cela pourrait causer des problèmes entre les types Hibernate qui sont equivalent et non pas equal. Par exemple, cela pourrait entraîner des problèmes avec des incompatibilités entre un attribut mappé en tant que org.hibernate.type.DateType et un attribut défini en tant que org.hibernate.type.TimestampType, bien que la base de données puisse ne pas faire la distinction ou puisse être capable de traiter la conversion.
attribute_list, dans quel cas sa valeur sera prise à partir de l'expression sélectionnée correspondante, ou l'omettre à partir de la attribute_list, dans quel cas une valeur générée sera utilisée. Cette dernière option n'est disponible que lors de l'utilisation de générateurs d'identifiants qui opèrent « dans la base de données ». Tenter d'utiliser cette option avec n'importe quel générateur de type « en mémoire » causera une exception en cours de traitement.
attribute_list, dans quel cas sa valeur sera prise à partir des expressions sélectionnées correspondantes, ou l'omettre à partir de la attribute_list dans quel cas la seed value définie par le org.hibernate.type.VersionType correspondant sera utilisé.
Exemple 12.3. Exemple d'énoncé de requêtes INSERT
String hqlInsert = "insert into DelinquentAccount (id, name) select c.id, c.name from Customer c where ..."; int createdEntities = s.createQuery( hqlInsert ).executeUpdate();
String hqlInsert = "insert into DelinquentAccount (id, name) select c.id, c.name from Customer c where ...";
int createdEntities = s.createQuery( hqlInsert ).executeUpdate();
12.4.4. La clause FROM Copier lienLien copié sur presse-papiers!
FROM est chargée de définir l'étendue des types de modèles objets disponibles au reste de la requête. Elle est également chargée de définir toutes les « variables d'identification » disponibles au reste de la requête.
12.4.5. La clause WITH Copier lienLien copié sur presse-papiers!
WITH pour qualifier les conditions de jointure. Cela est spécifique à HQL. JPQL ne définit pas cette fonctionnalité.
Exemple 12.4. Exemple de jointure de with-clause
select distinct c
from Customer c
left join c.orders o
with o.value > 5000.00
select distinct c
from Customer c
left join c.orders o
with o.value > 5000.00
with clause font partie de on clause dans le SQL généré contrairement aux autres requêtes dans cette section où les conditions HQL/JPQL font partie de la where clause dans le SQL généré. La différence dans cet exemple en particulier n'est sûrement pas très importante. La with clause est quelques fois nécessaire pour des requêtes plus compliquées.
12.4.6. Mises à jour, insertions et suppressions en bloc Copier lienLien copié sur presse-papiers!
Avertissement
( UPDATE | DELETE ) FROM? EntityName (WHERE where_conditions)?.
Note
FROM et la clause WHERE sont optionnels.
Exemple 12.5. Exemple de déclaration de mise à jour en bloc
Exemple 12.6. Exemple de déclaration de suppression en bloc
int renvoyée par la méthode Query.executeUpdate() indique le nombre d'entités qui se trouvent dans la base de données et qui sont affectées par l'opération.
Company (entreprises) qui contiennent oldName dans le tableau, mais aussi dans les tableaux de liaisons. Donc, un tableau d'entreprises (Companies) qui se trouve dans une relation BiDirectionelle ManyToMany avec un tableau d'employés (Employee) perdrait des lignes dans le tableau de liaison correspondant Company_Employee suite à l'exécution de l'exemple précédent.
int deletedEntries ci-dessus contiendra le nombre de lignes affectées par cette opération, y compris les lignes qui se trouvent dans les tableaux de liaisons.
INSERT INTO EntityName properties_list select_statement.
Note
Exemple 12.7. Exemple de déclaration d'insertion en bloc
id via SELECT, un ID sera généré, tant que la base de données sous-jacente prend en charge les clés générées automatiquement. La valeur de retour de cette opération d'insertion en bloc est le nombre d'entrées créées dans la base de données.
12.4.7. Références de collection Copier lienLien copié sur presse-papiers!
Exemple 12.8. Exemple de références de collection
o fait référence au type de modèle de variable Order qui correspond au type d'éléments de l'association Customer#orders.
IN. Les deux formes sont équivalentes. La forme choisie par une application est tout simplement une question de goût.
12.4.8. Expressions de chemins qualifiés Copier lienLien copié sur presse-papiers!
| Expression | Description |
|---|---|
VALUE |
Correspond à la valeur de la collection. C'est équivalent à ne pas spécifier de qualificateur. Utile pour démontrer une intention. Valide pour n'importe quel type de référence collection-valued.
|
INDEX |
Selon les règles HQL, ceci est valable pour les mappages et pour les listes qui spécifient une annotation
javax.persistence.OrderColumn pour désigner la clé de Mappage ou la position de la Liste (aka la valeur OrderColumn). JPQL toutefois réserve ceci pour une utilisation dans la case Liste et ajoute la clé dans la case Mappage. Les applications intéressées par la transférabilité des fournisseurs JPA doivent tenir compte de cette distinction.
|
KEY |
Uniquement valide pour le mappage. Se réfère à la clé de mappage. Si la clé elle-même est une entité, elle peut naviguer davantage.
|
ENTRY |
Uniquement valide pour les mappages. Voir le tuple (combinaison d'une clé et de sa valeur) logique du Mappagev
java.util.Map.Entry. ENTRY n'est valide qu'en tant que chemin final et uniquement pour la clause sélectionnée.
|
Exemple 12.9. Exemple de références de collection qualifiée
12.4.9. Fonctions scalaires Copier lienLien copié sur presse-papiers!
12.4.10. Fonctions standardisées HQL Copier lienLien copié sur presse-papiers!
| Fonction | Description |
|---|---|
BIT_LENGTH |
Renvoie la longueur des données binaires.
|
CAST |
Effectue une transcription SQL. La cible de transcription doit désigner le type de mappage Hibernate à utiliser. Voir le chapitre sur les types de données pour obtenir plus d'informations.
|
EXTRACT |
Effectue une extraction SQL sur les valeurs Heure/Date. L'extraction soutire une partie de la valeur (l'année, par exemple). Voir les formes d'abréviation ci-dessous.
|
SECOND |
Abréviation pour extraire une Seconde.
|
MINUTE |
Forme d'abréviation pour extraire une Minute.
|
HOUR |
Abréviation pour extraire une Heure.
|
DAY |
Abréviation pour extraire un Jour.
|
MONTH |
Abréviation pour extraire un Mois.
|
YEAR |
Abréviation pour extraire une Année.
|
STR |
Abréviation pour la conversion d'une valeur en caractère.
|
addSqlFunction de org.hibernate.cfg.Configuration
12.4.11. Opération de concaténation Copier lienLien copié sur presse-papiers!
CONCAT). N'est pas défini par JPQL, donc les applications portables doivent éviter de l'utiliser. L'opérateur de concaténation vient d'un opérateur de concaténation SQL - ||.
Exemple 12.10. Exemple d'opération de concaténation
select 'Mr. ' || c.name.first || ' ' || c.name.last from Customer c where c.gender = Gender.MALE
select 'Mr. ' || c.name.first || ' ' || c.name.last
from Customer c
where c.gender = Gender.MALE
12.4.12. Instanciation dynamique Copier lienLien copié sur presse-papiers!
Exemple 12.11. Exemple d'instanciation dynamique - Constructor
select new Family( mother, mate, offspr )
from DomesticCat as mother
join mother.mate as mate
left join mother.kittens as offspr
select new Family( mother, mate, offspr )
from DomesticCat as mother
join mother.mate as mate
left join mother.kittens as offspr
Exemple 12.12. Exemple d'instanciation dynamique - List
select new list(mother, offspr, mate.name)
from DomesticCat as mother
inner join mother.mate as mate
left outer join mother.kittens as offspr
select new list(mother, offspr, mate.name)
from DomesticCat as mother
inner join mother.mate as mate
left outer join mother.kittens as offspr
Exemple 12.13. Exemple d'instanciation dynamique - Mappe
12.4.13. Prédicats HQL Copier lienLien copié sur presse-papiers!
TRUE ou FALSE, bien que les comparaison booléènnes comportant des NULL résolvent les UNKNOWN.
Prédicats HQL
- Prédicat Nullness
- Cherchez une valeur nulle et sans effet. Peut s'appliquer à des références d'attributs de base, à des références d'entité et à des paramètres. De plus, HQL permet une application à des types de composants/intégrables.
Exemple 12.14. Exemples de vérification de Nullness
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Prédicat Like
- Procède à une comparaison d'équivalence entre des valeurs de chaîne. La syntaxe est la suivante :
like_expression ::= string_expression [NOT] LIKE pattern_value [ESCAPE escape_character]
like_expression ::= string_expression [NOT] LIKE pattern_value [ESCAPE escape_character]Copy to Clipboard Copied! Toggle word wrap Toggle overflow Les sémantiques suivent l'expression Like SQL. Lapattern_valueest un modèle qui tente de correspondre à l'expression de chaînestring_expression. Tout comme pour l'expresion «like» SQL, le modèle oupattern_valuepeut utiliser "_" et "%" comme caractères génériques. Les significations sont les mêmes. "_" correspond à n'importe quel caractère unique. "%" correspond à un certain nombre de caractères.Le caractèreescapeoptionnel est utilisé pour spécifier un caractère d'échappement en combinaison à ce qui est impliqué par "_" ou "%" dans le modèle oupattern_value. Ceci est utile quand on doit chercher des modèles contenant des "_" ou des "%".Exemple 12.15. Exemples de prédicats «Like»
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Prédicat Between
- Ressemble à l'expression SQL
BETWEEN. Détermine qu'une valeur est entre 2 autres valeurs. Tous les opérandes doivent avoir des types comparables.Exemple 12.16. Exemples de prédicats «Between»
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
12.4.14. Comparaisons relationnelles Copier lienLien copié sur presse-papiers!
Exemple 12.17. Exemples de comparaisons relationnelles
ALL, ANY, SOME. SOME et ANY sont synonymes.
ALL passe à true si la comparaison est true pour toutes les valeurs qui se trouvent dans le résultat de la sous-requête. Passe à false si le résultat de la sous-requête est vide.
Exemple 12.18. Exemple de qualificateur de comparaison de sous-requête ALL
ANY/SOME passe à true si la comparaison est true pour toutes les valeurs qui se trouvent dans le résultat de la sous-requête. Passe à false si le résultat de la sous-requête est vide.
12.4.15. Prédicat IN Copier lienLien copié sur presse-papiers!
IN effectue une vérification pour savoir si une valeur donnée fait partie de la liste des valeurs. Sa syntaxe est la suivante :
single_valued_expression et des valeurs individuelles qui se trouvent dans la liste single_valued_list doivent être consistantes. JPQL limite les types valides ici à des chaînes, des valeurs numériques, date, heure, heure/date, et enum. Dans JPQL, single_valued_expression ne peut se référer qu'à des :
- "state fields", son terme pour attributs simples. Cela exclut en particulier les attributs composants/intégrés et associations.
- expression de type d'entité.
single_valued_expression peut désigner un bien plus large éventail de types d'expression. Les association de valeurs simples sont autorisées, ainsi que les attributs composant/intégré, bien que cette fonctionnalité dépend du niveau de soutien pour le tuple ou pour la «syntaxe de constructeur de valeur de ligne» dans la base de données sous-jacente. En outre, les HQL ne limitent le type de valeur en aucune façon, bien que les développeurs d'applications doivent être conscients que les différents types peuvent encourir un soutien limité basé sur le fournisseur de base de données sous-jacent. C'est en grande partie la raison des limitations JPQL
constructor_expression et collection_valued_input_parameter, la liste des valeurs ne doit pas rester vide; elle doit contenir une valeur au moins.
Exemple 12.19. Exemples de prédicat
12.4.16. SQL Ordering Copier lienLien copié sur presse-papiers!
ORDER BY est utilisée pour spécifier les valeurs sélectionnées à utiliser pour ordonnancer le résultat. Les types d'expressions considérées comme valides pour la clause order-by sont les suivantes :
- champs d'état
- attributs composant/intégré
- expressions scalaires comme les opérations arithmétiques, les fonctions, etc.
- variable d'identification déclarée dans la clause Select pour n'importe quel type d'expression antérieure.
ASC (ascendant) ou DESC (descendant) pour indiquer la direction d'ordonnancement désirée.
Exemple 12.20. Exemple Order-by
12.5. Services Hibernate Copier lienLien copié sur presse-papiers!
12.5.1. Les services Hibernate Copier lienLien copié sur presse-papiers!
12.5.2. Contrats de service Copier lienLien copié sur presse-papiers!
org.hibernate.service.Service. Hibernate l'utilise en interne pour des raisons de sécurité de base.
org.hibernate.service.spi.Startable et org.hibernate.service.spi.Stoppable pour recevoir des notifications de démarrage ou d'arrêt. Il existe un autre service org.hibernate.service.spi.Manageable qui indique que le service est gérable dans le JMX dans la mesure où l'intégration JMX est activée.
12.5.3. Types de dépendances de service Copier lienLien copié sur presse-papiers!
- @
org.hibernate.service.spi.InjectService - Toute méthode de classe d'implémentation de service qui accepte un seul paramètre et qui est annotée par @
InjectServiceest considérée comme réclamant une injection de la part d'un autre service.Par défaut, le type du paramètre de méthode doit correspondre au rôle de service à injecter. Si le type de paramètre est différent du rôle de service, l'attributserviceRoleduInjectServicedevra être utilisé pour nommer explicitement le rôle.Les services injectés sont requis par défaut, c'est à dire que le démarrage échouera si un service dépendant nommé est manquant. Si le service injecté est optionnel, l'attributrequisd'InjectServicedevra être déclaréfalse(la valeur par défaut esttrue). org.hibernate.service.spi.ServiceRegistryAwareService- La seconde approche est une approche pull pour laquelle le service implémente l'interface de service optionnelle
org.hibernate.service.spi.ServiceRegistryAwareServicequi déclare une méthodeinjectServicesunique.En cours de démarrage, Hibernate injectera leorg.hibernate.service.ServiceRegistrylui-même dans les services qui implémentent cette interface. Le service pourra alors utiliser la référenceServiceRegistrypour trouver les services additionnels dont il pourrait avoir besoin.
12.5.4. Le ServiceRegistry Copier lienLien copié sur presse-papiers!
12.5.4.1. Le ServiceRegistry Copier lienLien copié sur presse-papiers!
org.hibernate.service.ServiceRegistry. Le but principal d'un registre de service est de contenir, de gérer et de donner accès aux services.
org.hibernate.service.ServiceRegistryBuilder pour créer une instance org.hibernate.service.ServiceRegistry.
Exemple 12.21. Utiliser ServiceRegistryBuilder pour créer un ServiceRegistry
ServiceRegistryBuilder registryBuilder = new ServiceRegistryBuilder( bootstrapServiceRegistry );
ServiceRegistry serviceRegistry = registryBuilder.buildServiceRegistry();
ServiceRegistryBuilder registryBuilder = new ServiceRegistryBuilder( bootstrapServiceRegistry );
ServiceRegistry serviceRegistry = registryBuilder.buildServiceRegistry();
12.5.5. Services personnalisés Copier lienLien copié sur presse-papiers!
12.5.5.1. Services personnalisés Copier lienLien copié sur presse-papiers!
org.hibernate.service.ServiceRegistry est créé, il est considéré comme immuable. Les services eux-mêmes pourraient accepter une reconfiguration, mais ici, l'immuabilité signifie un ajout/remplacement des services. Et donc, un autre rôle assuré par org.hibernate.service.ServiceRegistryBuilder est de permettre de peaufiner des services qui figureront dans le org.hibernate.service.ServiceRegistry qu'il génère.
org.hibernate.service.ServiceRegistryBuilder à propos de services personnalisés.
- Implémenter une classe
org.hibernate.service.spi.BasicServiceInitiatorpour contrôler la construction sur demande de la classe du service et y ajouter leorg.hibernate.service.ServiceRegistryBuildervia sa méthodeaddInitiator. - Il vous suffit d'instancier la classe de service et de l'ajouter au
org.hibernate.service.ServiceRegistryBuildervia sa méthodeaddService.
Exemple 12.22. Utiliser ServiceRegistryBuilder pour remplacer un service existant par un service personnalisé
12.5.6. Le registre Bootstrap Copier lienLien copié sur presse-papiers!
12.5.6.1. Le registre Boot-strap Copier lienLien copié sur presse-papiers!
ClassLoaderService qui en est un parfait exemple. Même la résolution des fichiers de configuration doit avoir accès aux services de chargement de classes (pour la recherche de ressources). C'est le registre racine (sans parent) en conditions normales d'utilisation.
org.hibernate.service.BootstrapServiceRegistryBuilder.
12.5.6.2. Utilisation de BootstrapServiceRegistryBuilder Copier lienLien copié sur presse-papiers!
Exemple 12.23. Utilisation de BootstrapServiceRegistryBuilder
12.5.6.3. Les services BootstrapRegistry Copier lienLien copié sur presse-papiers!
org.hibernate.service.classloading.spi.ClassLoaderService
- la capacité de localiser des classes d'application
- la capacité de localiser des classes d'intégration
- la capacité de localiser des ressources (fichiers de propriétés, fichiers xml, etc.)
- la capacité à charger
java.util.ServiceLoader
Note
org.hibernate.integrator.spi.IntegratorService
java.util.ServiceLoader fournie par org.hibernate.service.classloading.spi.ClassLoaderService pour découvrir les implémentations du contrat org.hibernate.integrator.spi.Integrator.
/META-INF/services/org.hibernate.integrator.spi.Integrator et le rendraient disponible sur le chemin de classe.
java.util.ServiceLoader. Ce dernier répertorie, sur chaque ligne, le nom complet des classes qui mettent en œuvre l'interface org.hibernate.integrator.spi.Integrator.
12.5.7. Le registre SessionFactory Copier lienLien copié sur presse-papiers!
12.5.7.1. Le registre SessionFactory Copier lienLien copié sur presse-papiers!
org.hibernate.SessionFactory donnée, les instances de service de ce groupe appartiennent explicitement à une org.hibernate.SessionFactory unique.
org.hibernate.SessionFactory pour pouvoir être initiées. Ce registre spécial est org.hibernate.service.spi.SessionFactoryServiceRegistry
12.5.7.2. Services SessionFactory Copier lienLien copié sur presse-papiers!
org.hibernate.event.service.spi.EventListenerRegistry
- Description
- Service pour gérer les listeners d'événements
- Initiateur
org.hibernate.event.service.internal.EventListenerServiceInitiator- Implémentations
org.hibernate.event.service.internal.EventListenerRegistryImpl
12.5.8. Intégrateurs Copier lienLien copié sur presse-papiers!
12.5.8.1. Intégrateurs Copier lienLien copié sur presse-papiers!
org.hibernate.integrator.spi.Integrator a pour but de procurer un simple moyen de permettre aux développeurs de raccrocher un processus de création de SessionFactory en état de fonctionnement. L'interface org.hibernate.integrator.spi.Integrator définit 2 méthodes intéressantes : integrate permet de se joindre à un processus de création; disintegrate nous permet de raccrocher la fermeture de la SessionFactory.
Note
org.hibernate.integrator.spi.Integrator, une forme surchargée de integrate qui accepte un org.hibernate.metamodel.source.MetadataImplementor à la place d'une org.hibernate.cfg.Configuration. Cette forme a pour dessein d'être utilisée avec le nouveau code de méta modèle qui devra est opérationnel dans 5.0.
12.5.8.2. Cas d'utilisation d'Integrator Copier lienLien copié sur presse-papiers!
org.hibernate.integrator.spi.Integrator actuellement consistent à enregistrer des listeners d'événements et de fournir des services (voir org.hibernate.integrator.spi.ServiceContributingIntegrator). Dans 5.0, nous espérons étendre ceci afin de permettre de modifier les méta modèles qui décrivent le mappage entre les modèles relationnels et les objets.
Exemple 12.24. Enregistrement des listeners d'événements
12.6. Validation d'un bean Copier lienLien copié sur presse-papiers!
12.6.1. Bean Validation Copier lienLien copié sur presse-papiers!
bean-validation : Section 1.4.1.1, « Accès aux Quickstarts ».
12.6.2. Hibernate Validator Copier lienLien copié sur presse-papiers!
12.6.3. Contraintes de validation Copier lienLien copié sur presse-papiers!
12.6.3.1. Les contraintes de validation Copier lienLien copié sur presse-papiers!
12.6.3.2. Créer une annotation de contrainte dans Red Hat JBoss Developer Studio Copier lienLien copié sur presse-papiers!
Cette tâche couvre le processus de création d'une annotation de contrainte dans Red Hat JBoss Developer Studio, à utiliser dans une application Java.
Conditions préalables
Procédure 12.5. Créer une annotation de contrainte
- Ouvrir un projet Java dans Red Hat JBoss Developer Studio
Créer un ensemble de données
Une annotation de contrainte requiert un ensemble de données qui définissent les valeurs qui conviennent.- Cliquer à droite sur le dossier racine du projet dans la section Project Explorer.
- Sélectionner → .
- Configurer les éléments suivants :
- Package :
- Nom :
- Cliquer sur le bouton pour ajouter des interfaces selon les besoins.
- Cliquer sur pour créer le fichier.
- Ajouter un ensemble de valeurs à l'ensemble des données et cliquer sur .
Exemple 12.25. Exemple d'ensemble de données
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Créer le fichier Annotation
Créer une nouvelle classe Java- Configurer l'annotation de la contrainte et cliquer sur .
Exemple 12.26. Exemple de fichier d'annotation de contrainte
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- Résultat
- Une annotation de contrainte personnalisée possédant un ensemble de valeurs possibles a été créée, prête à l'utilisation dans le projet Java.
12.6.3.3. Contraintes d'Hibernate Validator Copier lienLien copié sur presse-papiers!
| Annotation | + | Vérification du runtime | Impact des métadonnées Hibernate |
|---|---|---|---|
| @Length(min=, max=) | propriété (String) | Vérifier si la longueur de la chaîne de caractères correspond à la plage. | La colonne sera définie à la longueur maximum. |
| @Max(value=) | propriété (numérique ou représentation par chaîne d'un numérique) | Vérifiez si la valeur est inférieure ou égale à la valeur maximum. | Ajouter un contrôle sur la colonne. |
| @Min(value=) | propriété (numérique ou représentation par chaîne d'un numérique) | Vérifier si la valeur est supérieure ou égale à la valeur minimale. | Ajouter un contrôle sur la colonne. |
| @NotNull | propriété | Vérifier si la valeur est non nulle. | Colonne(s) non nulles. |
| @NotEmpty | propriété | Vérifier si la chaîne est non nulle ou vide. Vérifier si la connexion est non nulle ou vide. | Colonne(s) non nulles (pour Chaîne). |
| @Past | propriété (date ou calendrier) | Vérifier si la date est dans le passé. | Ajouter un contrôle sur la colonne. |
| @Future | propriété (date ou calendrier) | Vérifier si la date est dans le futur. | Aucun(e). |
| @Pattern(regex="regexp", flag=) or @Patterns( {@Pattern(...)} ) | propriété (String) | Vérifier si la propriété correspond à une expression standard avec un indicateur de correspondance (voir java.util.regex.Pattern). | Aucun(e). |
| @Range(min=, max=) | propriété (numérique ou représentation par chaîne d'un numérique) | Vérifier si la valeur est comprise entre la valeur minimum et la valeur maximum (comprise). | Ajouter un contrôle sur la colonne. |
| @Size(min=, max=) | propriété (tableau, collection, mappe) | Vérifier si la taille de l'élément est comprise entre la valeur minimum et la valeur maximum (comprise). | Aucun(e). |
| @AssertFalse | propriété | Vérifier si la méthode évalue à false (utile pour les contraintes en code et non pas sous forme d'annotations). | Aucun(e). |
| @AssertTrue | propriété | Vérifier si la méthode évalue à true (utile pour les contraintes en code et non pas sous forme d'annotations). | Aucun(e). |
| @Valid | propriété (objet) | Procède à une validation récursive de l'objet associé. Si l'objet correspond à une collection ou à un tableau, les éléments seront validés de façon récursive. Si l'objet est une mappe, les éléments correspondant à la valeur seront validés de façon récursive. | Aucun(e). |
| propriété (String) | Vérifier si la chaîne de caractères est bien conforme à la spécification de l'adresse email. | Aucun(e). | |
| @CreditCardNumber | propriété (String) | Vérifier si la chaîne de caractères correspond à un numéro de carte de crédit formaté (dérivatif de l'algorithme Luhn). | Aucun(e). |
| @Digits(integerDigits=1) | propriété (numérique ou représentation par chaîne d'un numérique) | Vérifier si la propriété est un numéro qui comprend un maximum de integerDigits chiffres et fractionalDigits chiffres sous forme de fraction. | Définit la précision et l'échelle de la colonne. |
| @EAN | propriété (String) | Vérifie si la chaîne correspond à un code UPC-A ou EAN formaté comme il faut. | Aucun(e). |
12.6.4. Configuration Copier lienLien copié sur presse-papiers!
12.6.4.1. Exemple de fichier de configuration de validation Copier lienLien copié sur presse-papiers!
Exemple 12.27. validation.xml
12.7. Envers Copier lienLien copié sur presse-papiers!
12.7.1. Hibernate Envers Copier lienLien copié sur presse-papiers!
@Audited, et ils stockent l'historique des modifications apportées à l'entité. Les données peuvent ensuite être récupérées et interrogées.
- vérifier tous les mappages définis par la spécification JPA,
- vérifier tous les mappages qui étendent la spécification JPA,
- vérifier toules les entités mappées ou qui utilisent l'API Hibernate natif
- journaliser des données pour chaque révision par l'intermédiaire d'une entité de révision, et
- interroger les données historiques.
12.7.2. Audit de classes persistantes Copier lienLien copié sur presse-papiers!
@Audited . Quand l'annotation s'applique à une classe, un tableau est créé, et ce tableau stocke l'historique de révision de l'entité.
12.7.3. Stratégies d'auditing Copier lienLien copié sur presse-papiers!
12.7.3.1. Stratégies d'auditing Copier lienLien copié sur presse-papiers!
- Stratégie d'audit par défaut
- Cette stratégie persiste les données d'audit avec la révision de départ. Pour chaque ligne insérée, mise à jour ou effacée dans un tableau audité, une ou plusieurs lignes seront insérées dans les tableaux d'audit, avec la révision de départ de sa validité.Les lignes des tableaux d'audit ne sont jamais mises à jour suite à une insertion. Les demandes d'informations d'audit utilisent des sous-requêtes pour sélectionner les lignes qui s'appliquent aux tableaux d'audit, et qui sont lentes et difficiles à indexer.
- Stratégie d'audit de validité
- Cette stratégie stocke la révision de départ, ainsi que la révision de fin de l'information d'audit. Pour chaque rangée insérée, mise à jour ou effacée dans un tableau audité, une ou plusieurs rangées seront insérées dans les tableaux d'audit, avec la révision de départ de sa validité.En même temps, le champ de révision de fin des lignes d'audit précédentes (si disponible) est défini pour cette révision. Les demandes d'informations d'audit peuvent ensuite utiliser entre révision de départ ou de fin, à la place des sous-requêtes. Cela signifie que persister les informations d'audit est un peu plus lent à cause des mises à jour supplémentaires, mais la récupération d'informations d'audit est beaucoup plus rapide.Cela peut également être amélioré en ajoutant des indices supplémentaires.
12.7.3.2. Définir la stratégie d'auditing Copier lienLien copié sur presse-papiers!
Il y a deux stratégies d'auditing prises en charge par JBoss EAP 6 : la stratégie d'audit de validité ou la stratégie d'audit par défaut. Cette tâche couvre les étapes nécessaires requises pour définir la stratégie d'auditing d'une application.
Procédure 12.6. Définir une stratégie d'auditing
- Configurer la propriété
org.hibernate.envers.audit_strategyqui se trouve dans le ficherpersistence.xmlde l'application. Si la propriété est définie dans le fichierpersistence.xml, alors la stratégie d'audit par défaut sera utilisée.Exemple 12.28. Définir la stratégie d'auditing par défaut
<property name="org.hibernate.envers.audit_strategy" value="org.hibernate.envers.strategy.DefaultAuditStrategy"/>
<property name="org.hibernate.envers.audit_strategy" value="org.hibernate.envers.strategy.DefaultAuditStrategy"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple 12.29. Définir la stratégie d'auditing de validité
<property name="org.hibernate.envers.audit_strategy" value="org.hibernate.envers.strategy.ValidityAuditStrategy"/>
<property name="org.hibernate.envers.audit_strategy" value="org.hibernate.envers.strategy.ValidityAuditStrategy"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
12.7.4. Introduction à l'auditing d'entités Copier lienLien copié sur presse-papiers!
12.7.4.1. Ajouter un support d'auditing à une entité JPA Copier lienLien copié sur presse-papiers!
Procédure 12.7. Ajouter un support d'auditing à une entité JPA
- Configurer les paramètres d'auditing disponibles qui conviennent au déploiement : Section 12.7.5.1, « Configurer les paramètres Envers ».
- Ouvrir l'entité JPA à auditer.
- Importer l'interface
org.hibernate.envers.Audited. - Appliquer l'annotation
@Auditedà chaque champ ou propriété à auditer, ou l'appliquer une seule fois à toute la classe.Exemple 12.30. Audit de deux champs
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple 12.31. Audit d'une classe complète
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
L'entité JPA a été configurée pour l'auditing. Un tableau intitulé Entity_AUD sera créé pour stocker les changements historiques.
12.7.5. Configuration Copier lienLien copié sur presse-papiers!
12.7.5.1. Configurer les paramètres Envers Copier lienLien copié sur presse-papiers!
Procédure 12.8. Configurer les paramètres Envers
- Ouvrir le fichier
persistence.xmlde l'application. - Ajouter, supprimer ou configurer les propriétés Envers selon les besoins. Pour obtenir une liste complète des propriétés disponibles, consulter Section 12.7.5.4, « Propriétés de configuration Envers ».
Exemple 12.32. Exemples de paramètres Envers
- Résultat
- L'auditing a été configuré pour toutes les entités JPA de l'application.
12.7.5.2. Activer ou désactiver l'auditing en cours d'exécution Copier lienLien copié sur presse-papiers!
Cette tâche couvre les étapes de configuration requises pour activer/désactiver l'auditing de version d'entité en cours d'exécution.
Procédure 12.9. Activer/désactiver l'auditing
- Sous-classe la classe
AuditEventListener. - Remplace les méthodes suivantes appelées sur les événements Hibernate :
- onPostInsert
- onPostUpdate
- onPostDelete
- onPreUpdateCollection
- onPreRemoveCollection
- onPostRecreateCollection
- Spécifie la sous-classe comme listener des événements.
- Détermine si le changement doit être vérifié.
- Passe l'appel à la sur-classe si le changement doit être vérifié.
12.7.5.3. Configurer l'auditing conditionnel. Copier lienLien copié sur presse-papiers!
Hibernate Envers persiste les données d'auditing en réaction à certains événements, en utilisant une série de listeners d'événements. Ces listeners sont enregistrés automatiquement si le jar Envers est sur le chemin de classe. Cette tâche couvre les étapes requises pour mettre en place l'auditing conditionnel, en remplaçant certains listeners d'événements Envers.
Procédure 12.10. Implémentation de l'Auditing conditionnel
- Définir la propriété Hibernate
hibernate.listeners.envers.autoRegisterà false dans le fichierpersistence.xml. - Sous-classer chaque listener d'événement à remplacer. Mettez la logique d'auditing conditionnel dans la sous-classe, et appeler la super méthode si on doit procéder à l'auditing.
- Créer une implémentation personnalisée de
org.hibernate.integrator.spi.Integrator, semblable àorg.hibernate.envers.event.EnversIntegrator. Utiliser les sous-classes de listeners d'événements créées à la deuxième étape, à la place des classes par défaut. - Ajouter un fichier
META-INF/services/org.hibernate.integrator.spi.Integratorau jar. Ce fichier doit contenir le nom complet de la classe qui implémente d'interface.
L'auditing conditionnel alors est configuré, remplaçant ainsi les listeners d'événements Envers par défaut.
12.7.5.4. Propriétés de configuration Envers Copier lienLien copié sur presse-papiers!
| Nom de propriété | Valeur par défaut | Description |
|---|---|---|
|
org.hibernate.envers.audit_table_prefix
| |
String attaché au nom d'une entité auditée, pour créer le nom de l'entité qui contiendra l'audit en formation.
|
|
org.hibernate.envers.audit_table_suffix
|
_AUD
|
String attaché au nom d'une entité auditée, pour créer le nom de l'entité qui contiendra l'audit en formation. Par exemple, si une entité ayant comme nom de tableau
Person est auditée, Envers créera un tableau nommé Person_AUD pour stocker les données historiques.
|
|
org.hibernate.envers.revision_field_name
|
REV
|
Le nom du champ qui contient le numéro de révision dans l'entité d'audit.
|
|
org.hibernate.envers.revision_type_field_name
|
REVTYPE
|
Le nom du champ de l'entité d'audit qui contient le type de révision. Les types actuels de révision possibles sont :
add, mod et del.
|
|
org.hibernate.envers.revision_on_collection_change
|
true
|
Cette propriété indique si une révision doit être créée si un champ relationnel qui n'appartient à personne change. Il peut s'agir d'une collection d'une relation one-to-many, ou bien du champ qui utilise l'attribut
mappedBy dans une relation one-to-one.
|
|
org.hibernate.envers.do_not_audit_optimistic_locking_field
|
true
|
Si true, les propriétés utilisées pour le verrouillage optimiste (annoté par
@Version) sera exclus automatiquement de l'audit.
|
|
org.hibernate.envers.store_data_at_delete
|
false
|
Cette propriété définit si oui ou non les données d'entité doivent être stockées dans la révision lorsque l'entité est supprimée, au lieu de l'ID uniquement, avec toutes les autres propriétés marquées comme null. Ce n'est pas généralement nécessaire, car les données sont présentes dans l'avant dernière révision. Parfois, il est plus facile et plus efficace d'y accéder dans la dernière révision. Cependant, cela signifie que les données de l'entité contenues avant suppression apparaissent deux fois.
|
|
org.hibernate.envers.default_schema
|
null (comme dans les tableaux normaux)
|
Le nom de schéma par défaut utilisé pour les tableaux d'audit. Peut être substitué à l'aide de l'annotation
@AuditTable(schema="..."). Si absent, le schéma sera le même que le schéma des tableaux normaux.
|
|
org.hibernate.envers.default_catalog
|
null (comme dans les tableaux normaux)
|
Le nom de catalogue par défaut qui doit être utilisé dans les tableaux d'audit. Peut être substitué par l'annotation
@AuditTable(catalog="..."). Si non présent, le catalogue sera le même que le catalogue des tableaux normaux.
|
|
org.hibernate.envers.audit_strategy
|
org.hibernate.envers.strategy.DefaultAuditStrategy
|
Cette propriété définit la stratégie d'auditing qui doit être utilisée lors de la persistance des données d'audit. Par défaut, seule la révision où une entité a été modifiée est stockée. Alternativement,
org.hibernate.envers.strategy.ValidityAuditStrategy stocke la révision du départ et révision de la fin. Ceux-ci définissent ensemble quand une ligne d'auditing est valide.
|
|
org.hibernate.envers.audit_strategy_validity_end_rev_field_name
|
REVEND
|
Le nom de la colonne qui contiendra le dernier numéro de révision dans les entités d'auditing. Cette propriété n'est valide que si la stratégie d'auditing de validité est utilisée.
|
|
org.hibernate.envers.audit_strategy_validity_store_revend_timestamp
|
false
|
Cette propriété définit si l'horodatage du dernier numéro de révision des dernières données valides doit être conservé en plus de la dernière révision elle-même. Ceci est utile pour pouvoir purger les archives d'audit sur une base de données relationnelle en utilisant le partitionnement de la table. Le partitionnement exige une colonne qui existe dans la table. Cette propriété n'est évaluée que si la
ValidityAuditStrategy est utilisée
|
|
org.hibernate.envers.audit_strategy_validity_revend_timestamp_field_name
|
REVEND_TSTMP
|
Nom de la colonne d'horodatage de la dernière révision au moment où les données étaient encore valides. Utilisé uniquement si
ValidityAuditStrategy est utilisé, et si org.hibernate.envers.audit_strategy_validity_store_revend_timestamp évalue sur true.
|
12.7.6. Recherches Copier lienLien copié sur presse-papiers!
12.7.6.1. Suppression de l'information d'auditing Copier lienLien copié sur presse-papiers!
Hibernate Envers fournit une fonctionnalité qui permet d'extraire des informations d'audit par des requêtes. Cette section vous donne des exemples de telles requêtes.
Note
live, car elles impliquent des sous-sélections en corrélation.
Exemple 12.33. Chercher des entités d'une classe pour une révision donnée
AuditQuery query = getAuditReader()
.createQuery()
.forEntitiesAtRevision(MyEntity.class, revisionNumber);
AuditQuery query = getAuditReader()
.createQuery()
.forEntitiesAtRevision(MyEntity.class, revisionNumber);
AuditEntity. La recherche ci-dessous ne sélectionne que des entités dont la propriété nom est égale à John:
query.add(AuditEntity.property("name").eq("John"));
query.add(AuditEntity.property("name").eq("John"));
query.add(AuditEntity.property("address").eq(relatedEntityInstance));
// or
query.add(AuditEntity.relatedId("address").eq(relatedEntityId));
query.add(AuditEntity.property("address").eq(relatedEntityInstance));
// or
query.add(AuditEntity.relatedId("address").eq(relatedEntityId));
Exemple 12.34. Chercher les révisions de demandes pour lesquelles les entités d'une classe donnée ont changé
AuditQuery query = getAuditReader().createQuery()
.forRevisionsOfEntity(MyEntity.class, false, true);
AuditQuery query = getAuditReader().createQuery()
.forRevisionsOfEntity(MyEntity.class, false, true);
AuditEntity.revisionNumber()- Spécifie les contraintes, les projections et l'ordre en considération desquels l'entité auditée a été modifiée dans le numéro de révision.
AuditEntity.revisionProperty(propertyName)- Spécifier les contraintes, les projections et l'ordre de l'entité de révision sur une propriété , correspondants à la révision dans laquelle l'entité auditée a été modifiée.
AuditEntity.revisionType()- Fournit des accès au type de révision (ADD, MOD, DEL).
MyEntity, ayant pour ID entityId a changé, après le numéro de révision 42 :
actualDate d'une entité donnée est supérieure à une valeur donnée, mais aussi petite que possible :
minimize() et maximize() renvoient un critère, auquel des contraintes peuvent être ajoutées, et qui doit être respecté par les entités avec des propriétés maximisées/minimisées.
selectEntitiesOnly- Ce paramètre n'est valide que lorsqu'une projection explicite n'est pas définie.Si true, le résultat de la recherche correspondra à une liste d'entités qui ont changé lors de révisions satisfaisant les contraintes spécifiées.Si false, le résultat correspondra à une liste de trois tableaux d'éléments. Le premier élément correspondra à l'instance d'entité modifiée. Le second correspondra à une entité qui contient les données de révision. Si aucune entité personnalisée n'est utilisée, alors on aura une instance de
DefaultRevisionEntity. Le troisième tableau d'éléments correspondra au type de révision (ADD, MOD, DEL). selectDeletedEntities- Ce paramètre indique si les révisions dans lesquelles les entités ont été supprimées doivent être incluses dans les résultats. Si true, les entités auront le type de révision
DEL, et tous les champs, à part l'id, auront pour valeurnull.
Exemple 12.35. Chercher les révisions d'une entité qui ont pu modifier une propriété donnée
MyEntity pour une id donnée, quand la propriété actualDate a été modifiée.
AuditQuery query = getAuditReader().createQuery()
.forRevisionsOfEntity(MyEntity.class, false, true)
.add(AuditEntity.id().eq(id));
.add(AuditEntity.property("actualDate").hasChanged())
AuditQuery query = getAuditReader().createQuery()
.forRevisionsOfEntity(MyEntity.class, false, true)
.add(AuditEntity.id().eq(id));
.add(AuditEntity.property("actualDate").hasChanged())
hasChanged peut être combinée à des critères supplémentaires. La recherche ci-dessous renvoie une coupe horizontale de MyEntity au moment où le revisionNumber est créé. Ce sera limité aux révisions qui ont modifié prop1, et non pas prop2.
AuditQuery query = getAuditReader().createQuery()
.forEntitiesAtRevision(MyEntity.class, revisionNumber)
.add(AuditEntity.property("prop1").hasChanged())
.add(AuditEntity.property("prop2").hasNotChanged());
AuditQuery query = getAuditReader().createQuery()
.forEntitiesAtRevision(MyEntity.class, revisionNumber)
.add(AuditEntity.property("prop1").hasChanged())
.add(AuditEntity.property("prop2").hasNotChanged());
MyEntities modifiées dans le revisionNumber avec prop1 modifié et prop2 intact. »
forEntitiesModifiedAtRevision :
AuditQuery query = getAuditReader().createQuery()
.forEntitiesModifiedAtRevision(MyEntity.class, revisionNumber)
.add(AuditEntity.property("prop1").hasChanged())
.add(AuditEntity.property("prop2").hasNotChanged());
AuditQuery query = getAuditReader().createQuery()
.forEntitiesModifiedAtRevision(MyEntity.class, revisionNumber)
.add(AuditEntity.property("prop1").hasChanged())
.add(AuditEntity.property("prop2").hasNotChanged());
Exemple 12.36. Recherche d'entités modifiées dans une révision donnée
Set<Pair<String, Class>> modifiedEntityTypes = getAuditReader()
.getCrossTypeRevisionChangesReader().findEntityTypes(revisionNumber);
Set<Pair<String, Class>> modifiedEntityTypes = getAuditReader()
.getCrossTypeRevisionChangesReader().findEntityTypes(revisionNumber);
org.hibernate.envers.CrossTypeRevisionChangesReader:
List<Object> findEntities(Number)- Retourne des instantanés de toutes les entités d'auditing changées (ajoutées, mises à jour et supprimées) dans une révision donnée. Exécute des requêtes SQL
n + 1, oùnest un nombre de classes d'entités différentes modifiées dans la révision spécifiée. List<Object> findEntities(Number, RevisionType)- Retourne des instantanés de toutes les entités d'auditing changées (ajoutées, mises à jour et supprimées) dans une révision donnée filtrée par type de modification. Exécute des requêtes SQL
n + 1, oùnest un nombre de classes d'entités différentes modifiées dans la révision spécifiée. Map<RevisionType, List<Object>> findEntitiesGroupByRevisionType(Number)- Retourne une carte contenant les listes des instantanés d'entité regroupés par opération de modification (ajout, mise à jour et suppression). Exécute des requêtes SQL
3n + 1, oùnest un nombre de classes d'entités différentes modifiées au cours de la révision spécifiée.
12.8. Réglage de la performance Copier lienLien copié sur presse-papiers!
12.8.1. Algorithmes de chargement de lots alternatifs Copier lienLien copié sur presse-papiers!
- Niveau Par classeLors du chargement de données sur un niveau par classe, Hibernate, requiert la taille de lot de l'association à pré-charger lorsqu'il est interrogé. Par exemple, imaginons que lors de l'exécution, vous ayez 30 instances d'un objet
voiturechargées dans la session. Chaque objetvoitureappartient à un objetpropriétaire. Si vous deviez parcourir tous les objetsvoitureet appeler leurs propriétaires, par un chargementdifféré(lazy loading), Hibernate émettra 30 instructions select - une pour chaque propriétaire. Il s'agit d'un goulot d'étranglement de performance.À la place, vous pouvez dire à Hibernate de charger à l'avance le prochain lot de propriétaires avant qu'ils aient été interrogés par une requête. Quand un objetowner(propriétaire) est interrogé, Hibernate interrogera ces objets à plusieurs reprises dans le même énoncé SELECT.Le nombre d'objetsowner(propriétaire) à interroger à l'avance dépend du paramètrebatch-sizespécifié en cours de configuration :<class name="owner" batch-size="10"></class>
<class name="owner" batch-size="10"></class>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Cela indique à Hibernate d'interroger au moins 10 objetsownerau cas où ils seraient nécessaires dans un avenir proche. Lorsqu'un utilisateur interroge le propriétaireownerdecar A, le propriétaireownerdecar Bpeut déjà avoir été chargé dans un lot de chargement. Lorsque l'utilisateur a besoin du propriétaireownerdecar B, au lieu d'aller à la base de données (et émettre une instruction SELECT), la valeur peut être récupérée de la session en cours.En plus du paramètrebatch-size, Hibernate 4.2.0 a introduit un nouvel élément de configuration pour améliorer la performance de chargement de lots. La configuration s'appelleBatch Fetch Styleet est spécifiée par le paramètrehibernate.batch_fetch_style.Il existe trois styles d'extraction de lots pris en charge : LEGACY, PADDED et DYNAMIC. Pour spécifier le style, utiliserorg.hibernate.cfg.AvailableSettings#BATCH_FETCH_STYLE.- LEGACY : dans le style hérité de chargement, une série de tailles de lots pré-construits basées
ArrayHelper.getBatchSizes(int)sont utilisées. Les lots sont chargés à l'aide de la taille de lot de pré-construction suivante à partir du nombre d'identificateurs existants pouvant être mis en lot.En continuant avec l'exemple suivant, ayant une taillebatch-sizede 30, les tailles de lot pré-construits sont [30, 15, 10, 9, 8, 7, .., 1]. Si l'on tente de mettre en lots 29 identifiants, on obtiendra des lots de 15, 10 et 4. Il y aura 3 requêtes SQL correspondantes, chacune chargeant 15, 10 et 4 propriétaires de la base de données. - PADDED - similaire au style de chargement de classes LEGACY. Utilise toujours des tailles de lots pré-construits, mais utilise la taille de lot supérieure et remplit les espaces réservés de l'identifiant supplémentaire.Tout comme dans l'exemple ci-dessus, si 30 objets propriétaires doivent être initialisés, il ne pourra y avoir qu'une demande exécutée dans la base de données.Cependant, si 29 objets propriétaires doivent être initialisés, Hibernate n'exécutera qu'un seul énoncé select SQL de taille de lot 30, avec l'espace supplémentaire rempli par un identifiant répété.
- Dynamic - bien que toujours conforme à la limitation de la taille des lots, ce style de chargement dynamique de lots construit son énoncé SQL SELECT à l'aide du nombre réel d'objets à charger.Par exemple, pour 30 objets propriétaires, et une taille de lot maximale de 30, un appel pour récupérer 30 objets propriétaires entraînera une instruction SQL SELECT. Un appel pour récupérer 35 se traduira en deux énoncés SQL, ayant pour taille de lot 30 et 5, respectivement. Hibernate modifiera dynamiquement le second énoncé SQL pour maintenir à 5, le nombre requis, tout en restant sous la restriction de 30 pour la taille des lots. C'est différent de la version PADDED, car le deuxième SQL ne sera pas PADDED et à la différence du style LEGACY, il n'y a pas de taille fixe pour le second énoncé SQL - le second SQL est créé dynamiquement.Pour une requête inférieure à 30 identifiants, ce style ne chargera de façon dynamique que le nombre d'identifiants requis.
- Niveau Par collectionHibernate peut aussi mettre en lots des collections de chargement, en respectant la taille ou les styles des lots d'extraction suivant la liste de la section par-classe ci-dessus.Pour inverser l'exemple utilisé dans la section précédente, considérons que vous deviez charger tous les objets
car(voiture) appartenant à chaque objetowner(propriétaire). Si 10 objets propriétaireownersont chargés dans la session en cours, itérer tous les propriétaires va générer 10 énoncés SELECT, un pour chaque appel de méthode àgetCars(). Si vous activez l'extraction de lot pour la collection de voitures dans le mappage du propriétaire, Hibernate pourra chercher ces collections à l'avance, comme illustré ci-dessous.<class name="Owner"><set name="cars" batch-size="5"></set></class>
<class name="Owner"><set name="cars" batch-size="5"></set></class>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Donc, avec une taille de lot égale à 5 et en utilisant le style de lot hérité pour charger 10 collections, Hibernate exécutera deux énoncés SELECT, récupérant chacun 5 collections.
12.8.2. Mise en cache de second niveau d'objets de référence pour les données non mutables Copier lienLien copié sur presse-papiers!
hibernate.cache.use_reference_entries à true. Par défaut, hibernate.cache.use_reference_entries est défini à false.
hibernate.cache.use_reference_entries a pour valeur true, un objet de données immuables qui n'a pas d'associations n'est pas copié dans le cache de second niveau, et seule sa référence y sera stockée.
Avertissement
hibernate.cache.use_reference_entries a pour valeur true, un objet de données immuables qui possède des associations sera copié dans le cache de second niveau.
Chapitre 13. Hibernate Search Copier lienLien copié sur presse-papiers!
13.1. Introduction à Hibernate Search Copier lienLien copié sur presse-papiers!
13.1.1. Hibernate Search Copier lienLien copié sur presse-papiers!
13.1.2. Premières étapes de Recherche Hibernate Copier lienLien copié sur presse-papiers!
- Voir Configuration dans le Guide de configuration et d'administration pour configurer la Hibernate Search.
13.1.3. Activer Hibernate Search dans Maven Copier lienLien copié sur presse-papiers!
hibernate-search-orm :
13.1.4. Ajouter les annotations Copier lienLien copié sur presse-papiers!
example.Book et example.Author et vous souhaitez ajouter des fonctionnalités de recherche de texte libre à votre application pour pouvoir rechercher des livres.
Exemple 13.1. Livre et auteur d'entités avant l'ajout d'annotations spécifiques de Hibernate Search
Book et Author. La première annotation @Indexed désigne la classe Book comme indexable. Hibernate Search stocke un ID sans token dans l'index pour s'assurer de l'unicité d'index d'une entité donnée. @DocumentId indique la propriété à utiliser et est similaire, dans la plupart des cas, à la clé primaire de la base de données. L'annotation @DocumentId est facultative dans le cas où une annotation @Id existe.
title et subtitle et annotez-les avec @Field. Le paramètre index=Index.YES s'assurera que le texte sera indexé tandis que analyze=Analyze.YES s'assure que le texte sera analysé en utilisant l'analyseur Lucene par défaut. L'analyse signifie généralement diviser une phrase en mots et exclure certains termes courants comme « a » (un/une) ou « the » (le/la). Nous abordons les analyseurs plus en détail par la suite. Le troisième paramètre que nous indiquons dans @Field, store=Store.NO, permet de garantir que les données ne seront pas stockées dans l'index. Le fait ou non que ces données soient stockées dans l'index n'aura aucun impact sur la possibilité de les rechercher. Du point de vue de Lucene, il n'est pas nécessaire de préserver les données une fois l'index créé. L'avantage de les stocker réside dans la capacité de les récupérer par projections ( voir Section 13.3.1.10.5, « Projection »).
index=Index.YES, analyze=Analyze.YES et store=Store.NO sont les valeurs par défaut de ces paramètres et peuvent être omises.
@DateBridge n'a pas encore été abordée. Cette annotation fait partie des ponts de champ intégrés dans Hibernate Search. L'index Lucene se base uniquement sur des chaînes. C'est pour cette raison que Hibernate Search doit convertir les types de données des champs indexés en chaîne et vice-versa. Une gamme de ponts prédéfinis est fournie, y compris la classe DateBridge qui convertira une classe java.util.Date en une classe String avec la résolution indiquée. Pour plus de détails, veuillez consulter Section 13.2.4, « Ponts ».
@IndexedEmbedded. Cette annotation est utilisée pour indexer des entités associées (@ManyToMany, @*ToOne, @Embedded et @ElementCollection) comme faisant partie de l'entité propriétaire, ce qui est nécessaire puisqu'un document d'index Lucene est une structure de données plate ne connaissant rien aux relations d'objets. Pour faire en sorte que le nom des auteurs soit trouvable, vous devez vous assurer que les noms sont indexés comme faisant partie du livre. En plus de @IndexedEmbedded, vous devrez signaler tous les champs de l'entité associée que vous souhaitez inclure dans l'index comme @Indexed. Pour plus d'informations, veuillez consulter Section 13.2.1.3, « Objets associés et intégrés »
Exemple 13.2. Les entités après l'ajout d'annotations de Hibernate Search
13.1.5. Indexation Copier lienLien copié sur presse-papiers!
Exemple 13.3. Indexation de données à l'aide d'une session Hibernate
FullTextSession fullTextSession = org.hibernate.search.Search.getFullTextSession(session); fullTextSession.createIndexer().startAndWait();
FullTextSession fullTextSession = org.hibernate.search.Search.getFullTextSession(session);
fullTextSession.createIndexer().startAndWait();
Exemple 13.4. Indexation de données à l'aide de JPA
EntityManager em = entityManagerFactory.createEntityManager(); FullTextEntityManager fullTextEntityManager = org.hibernate.search.jpa.Search.getFullTextEntityManager(em); fullTextEntityManager.createIndexer().startAndWait();
EntityManager em = entityManagerFactory.createEntityManager();
FullTextEntityManager fullTextEntityManager = org.hibernate.search.jpa.Search.getFullTextEntityManager(em);
fullTextEntityManager.createIndexer().startAndWait();
/var/lucene/indexes/example.Book. Inspectez cet index avec Luke. Cela vous aidera à comprendre comment Hibernate Search fonctionne.
13.1.6. Recherche Copier lienLien copié sur presse-papiers!
org.hibernate.Query pour obtenir les fonctionnalités requises de l'API Hibernate. Le code suivant prépare une requête contre les champs indexés. L'exécution du code renvoie une liste de Book.
Exemple 13.5. Utiliser une session Hibernate Search pour créer et exécuter une recherche
Exemple 13.6. Utilisation de JPA pour créer et exécuter une recherche
13.1.7. Analyseur Copier lienLien copié sur presse-papiers!
Refactoring: Improving the Design of Existing Code et que des clics sont nécessaires pour les requêtes suivantes : refactor, refactors, refactored et refactoring. Sélectionnez une classe d'analyseur dans Lucene qui applique l'analyse de radical d'un mot lors de l'indexation et de la recherche. Hibernate Search offre plusieurs façons de configurer l'analyseur (voir Section 13.2.3.1, « Analyseur par défaut et analyseur par classe » pour plus d'informations) :
- Définir la propriété
analyzerdans le fichier de configuration. La classe spécifiée devient l'analyseur par défaut. - Définissez l'annotation
au niveau de l'entité.@Analyzer - Définissez l'annotation
@au niveau du champ.Analyzer
@AnalyzerDef avec l'annotation @Analyzer. Le framework de l'analyseur Solr et ses fabriques sont utilisés dans la dernière option. Pour plus d'informations sur les classes de fabrique, voir la JavaDoc Solrf ou lire un section correspondante Wiki Solr (http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters)
StandardTokenizerFactory est utilisé par deux fabriques de filtre : LowerCaseFilterFactory et SnowballPorterFilterFactory. Le générateur de jetons divise les mots à chaque caractère de ponctuation et tiret mais ne touche pas aux adresses e-mail et noms d'hôtes d'internet intacts. Le générateur de jetons est idéal pour cela mais également pour d'autres opérations d'ordre général. Le filtre de bas-de-casse convertit toutes les lettres dans le jeton en bas-de-casse et le filtre boule de neige applique une recherche de radical linguistique.
Exemple 13.7. Utilisation de @AnalyzerDef et du cadre Solr pour définir et utiliser un analyseur
@AnalyzerDef pour définir un analyseur, puis appliquez-le à des entités et propriétés à l'aide de @Analyzer. Dans cet exemple, le customanalyzer est défini mais pas appliqué à l'entité. L'analyseur est uniquement appliqué aux propriétés title et subtitle. Une définition d'analyseur est globale. Définissez l'analyseur pour une entité et réutilisez la définition pour d'autres entités si requis.
13.2. Mapper des entités dans la structure de l'index Copier lienLien copié sur presse-papiers!
13.2.1. Mappage d'une entité Copier lienLien copié sur presse-papiers!
13.2.1.1. Mappage de base Copier lienLien copié sur presse-papiers!
- @Indexed
- @Field
- @NumericField
- @Id
13.2.1.1.1. @Indexed Copier lienLien copié sur presse-papiers!
@Indexed (toutes les entités non annotées avec @Indexed seront ignorées par le processus d'indexation) :
Exemple 13.8. Rendre une classe indexable avec @Indexed
@Entity
@Indexed
public class Essay {
...
}
@Entity
@Indexed
public class Essay {
...
}
index de l'annotation @Indexed pour changer le nom par défaut de l'index.
13.2.1.1.2. @Field Copier lienLien copié sur presse-papiers!
@Field déclare une propriété comme indexée et autorise la configuration de plusieurs aspects du procédé d'indexation en définissant un ou plusieurs des attributs suivants :
name: décrit le nom sous lequel la propriété doit être stockée dans le Document Lucene. La valeur par défaut est le nom de propriété (d'après la convention de JavaBeans)store: indique si la propriété est stockée dans l'index Lucene. Vous pouvez stocker la valeurStore.YES(utilise plus d'espace dans l'index mais permet une projection, voir Section 13.3.1.10.5, « Projection »), la stocker de manière compresséeStore.COMPRESS(utilise davantage de CPU), ou refuser tout stockageStore.NO(valeur par défaut). Lorsqu'une propriété est stockée, vous pouvez récupérer sa valeur initiale à partir du document Lucene, indépendamment de l'indexation de l'élément.index: décrit si la propriété est indexée. Les valeurs disponibles sontIndex.NO(aucune indexation, la propriété ne peut être trouvée par une requête),Index.YES(l'élement est indexé et peut être recherché). La valeur par défaut estIndex.YES.Index.NOpeut être utile lorsqu'une propriété n'a pas l'obligation d'être trouvable mais doit être disponible pour une projection.Note
Index.NOen association avecAnalyze.YESouNorms.YESest inutile caranalyzeetnormsrequièrent que la propriété soit indexée.analyze: détermine si la propriété est analysée (Analyze.YES) ou pas (Analyze.NO). La valeur par défaut estAnalyze.YES.Note
Que vous souhaitiez ou non analyser une propriété dépendra de si vous souhaitez rechercher l'élément tel quel, ou par les mots qu'il contient. Il est utile d'analyser un champ de texte, mais peut-être pas un champ de date.Note
Les champs utilisés pour trier ne doivent pas être analysés.norms: décrit si l'information concernant le boosting de temps d'indexation doit être stocké (Norms.YES) ou pas (Norms.NO). Ne pas la stocker peut économiser une large partie de la mémoire, mais aucune information concernant le boosting de temps d'indexation ne sera disponible. La valeur par défaut estNorms.YES.termVector: décrit des collections de paires de fréquence d'un terme. Cet attribut permet de stocker les vecteurs de terme dans les documents au cours de l'indexation. La valeur par défaut estTermVector.NO.Les différentes valeurs de cet attribut sont :Expand Valeur Définition TermVector.YES Stocke les vecteurs de terme de chaque document et crée deux matrices synchronisées, une contenant des termes de document et l'autre contenant la fréquence d'un terme. TermVector.NO Ne pas stocker de vecteurs de terme. TermVector.WITH_OFFSETS Stocke le vecteur de terme et les informations de décalage de jeton. Identique à TermVector.YES mais contient également les informations de position de décalage de démarrage et de fin pour les termes. TermVector.WITH_POSITIONS Stocke le vecteur de terme et les informations de position de jeton. Identique à TermVector.YES mais contient également les positions ordinales de chaque occurrence d'un terme dans un document. TermVector.WITH_POSITION_OFFSETS Stocke le vecteur de terme, la position du jeton et les informations de décalage. Un mélange de YES, WITH_OFFSETS et WITH_POSITIONS. indexNullAs: par défaut, les valeurs nulles sont ignorées et pas indexées. Cependant, l'utilisation deindexNullAsvous permet de spécifier une chaîne qui sera insérée comme jeton pour la valeurnull. Cette valeur est définie par défaut commeField.DO_NOT_INDEX_NULL, indiquant que les valeursnullne devraient pas être indexées. Vous pouvez définir cette valeur commeField.DEFAULT_NULL_TOKENpour indiquer qu'un jetonnullpar défaut doit être utilisé. Ce jetonnullpar défaut peut être spécifié dans la configuration en utilisanthibernate.search.default_null_token. Si cette propriété n'est pas définie et que vous spécifiezField.DEFAULT_NULL_TOKEN, la chaîne "_null_" sera utilisée par défaut.Note
Lorsque le paramètreindexNullAsest utilisé, il est important d'utiliser le même jeton dans la requête de recherche pour rechercher les valeursnull. Il est également recommandé d'utiliser cette fonctionnalité uniquement avec des champs non-analysés ().analyze=Analyze.NOAvertissement
Lors de l'implémentation d'une classeFieldBridgeouTwoWayFieldBridgepersonnalisée, il appartient au développeur de gérer l'indexation des valeurs nulles (voir JavaDocs deLuceneOptions.indexNullAs()).
13.2.1.1.3. @NumericField Copier lienLien copié sur presse-papiers!
@Field appelée @NumericField pouvant être spécifiée dans la même étendue que @Field ou @DocumentId. Elle peut être spécifiée pour les propriétés Integer, Long, Float et Double. Au moment de l'indexation, la valeur sera indexée à l'aide d'une structure Trie. Une propriété indexée comme champ numérique plutôt que propriété standard permet une requête de données plus rapide que sur des propriétés @Field standards. L'annotation @NumericField accepte les paramètres suivants :
| Valeur | Définition |
|---|---|
| forField | (Facultatif) Spécifier le nom du @Field correspondant qui sera indexé comme numérique. Cela est uniquement obligatoire lorsque la propriété contient plus d'une déclaration @Field. |
| precisionStep | (Facultatif) Change la manière dont la structure « Trie » est stockée dans l'index. Des étapes de précision plus petites mènent à davantage d'utilisation d'espace disque et des requêtes de trie et de gamme plus rapides. Des valeurs supérieures conduisent à un espace utilisé moindre et à une performance de requête de gamme plus proche de la requête de gamme dans les @Fields normaux. La valeur par défaut est 4. |
@NumericField prend uniquement en charge Double, Long, Integer et Float. Il n'est pas possible de prendre un avantage d'une fonctionnalité similaire dans Lucene pour les autres types numériques. Les types restants doivent donc utiliser la chaîne dont le codage est effectué par la classe TwoWayFieldBridge par défaut ou personnalisée.
NumericFieldBridge personnalisée si vous savez gérer l'approximation lors de la transformation du type :
Exemple 13.9. Définition d'une classe NumericFieldBridge personnalisée
13.2.1.1.4. @Id Copier lienLien copié sur presse-papiers!
id (identifiant) d'une entité est une propriété spéciale utilisée par Hibernate Search pour assurer l'unicité d'index d'une entité donnée. Un id doit être stocké et ne pas être segmenté. Pour identifier une propriété comme identifiant d'index, utilisez l'annotation @DocumentId. Si vous utilisez JPA et que vous avez spécifié @Id, vous pouvez omettre @DocumentId. L'identifiant d'entité choisi sera également utilisé comme identifiant de document.
Exemple 13.10. Spécification des propriétés indexées
id , Abstract, text et grade. Veuillez noter que par défaut, le nom de champ ne contient pas de majuscules, d'après les normes JavaBean. Le champ grade est annoté comme numérique avec une étape de précision légèrement plus large que celle par défaut.
13.2.1.2. Mapper des propriétés plusieurs fois Copier lienLien copié sur presse-papiers!
Exemple 13.11. Utilisation de @Fields pour mapper une propriété plusieurs fois
summary est indexé deux fois, la première fois comme summary avec des jetons, puis comme summary_forSort sans jetons.
13.2.1.3. Objets associés et intégrés Copier lienLien copié sur presse-papiers!
address.city:Atlanta). Les champs de lieu seront indexés dans l'index Place. Les documents de l'index Place contiendront également les champs address.id, address.street et address.city pour lesquels vous pourrez faire une requête.
Exemple 13.12. Associations d'indexation
@IndexedEmbedded, Hibernate Search doit être informé de tout changement dans les objets Place et Address afin de maintenir l'index à jour. Pour garantir que le document Lucene Place est mis à jour lorsque son Address est modifiée, indiquez @ContainedIn de l'autre côté de la relation bidirectionnelle.
Note
@ContainedIn est utile pour les deux associations indiquant les entités ainsi que pour les (collections d') objets intégrés.
Exemple 13.13. Utilisation imbriquée de @IndexedEmbedded et @ContainedIn
@*ToMany, @*ToOne et @Embedded peut être annoté par @IndexedEmbedded. Les attributs de la classse associée seront ensuite ajoutés à l'index d'entités principal. Dans l'Exemple 13.13, « Utilisation imbriquée de @IndexedEmbedded et @ContainedIn », l'index contiendra les champs suivants :
- id
- name
- address.street
- address.city
- address.ownedBy_name
propertyName., suivi de la convention de navigation d'objet traditionnelle. Vous pouvez le remplacer à l'aide de l'attribut prefix tel que démontré dans la propriété ownedBy.
Note
depth est nécessaire lorsque le graphique de l'objet comprend une dépendance cyclique de classes (non d'instances). Par exemple, si Owner indique Place. Hibernate Search arrêtera d'inclure les attributs intégrés indexés une fois la profondeur souhaitée atteinte (ou dès que les limites du graphique de l'objet sont atteintes). Une classe possédant une auto-référence est un exemple de dépendance cyclique. Dans notre exemple, depth étant défini sur 1, tout attribut @IndexedEmbedded dans Owner (le cas échéant) sera ignoré.
@IndexedEmbedded pour les associations d'objets vous permet d'exprimer des requêtes (à l'aide de la syntaxe de requête de Lucene) telles que :
- Renvoyer des lieux dont le nom contient JBoss et dont l'adresse se trouve à Atlanta. En requête Lucene, cela s'apparente à :
+name:jboss +address.city:atlanta
+name:jboss +address.city:atlantaCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Renvoyer des lieux dont le nom contient JBoss et dont le nom du propriétaire contient Joe. En requête Lucene, cela s'apparente à :
+name:jboss +address.ownedBy_name:joe
+name:jboss +address.ownedBy_name:joeCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Note
@Indexed
@ContainedIn (tel que dans l'exemple précédent). Sinon, Hibernate Search n'a aucun moyen de mettre à jour l'index de root quand l'entité associée est mise à jour (dans notre exemple, un document index Place doit être mis à jour lorsque l'instance Address associée est mise à jour).
@IndexedEmbedded n'est pas le type d'objet ciblé par Hibernate et Hibernate Search. Cela est particulièrement le cas lorsque les interfaces sont utilisées au lieu de leur implémentation. Vous pouvez pour cette raison remplacer le type d'objet ciblé par Hibernate Search à l'aide du paramètre targetElement.
Exemple 13.14. Utilisation de la propriété targetElement de @IndexedEmbedded
13.2.1.4. Limitation de l'intégration d'objets à des chemins spécifiques Copier lienLien copié sur presse-papiers!
@IndexedEmbedded fournit également un attribut includePaths pouvant être utilisé comme alternative à ou en association avec la méthode depth (profondeur).
depth est utilisé, tous les champs indexés du type intégré seront ajoutés de manière récursive à la même profondeur. Cela complique la sélection d'un seul chemin spécifique sans ajouter tous les autres champs, qui ne sont pas forcément utiles.
includePaths de @IndexedEmbedded ».
Exemple 13.15. Utilisation de la propriété includePaths de @IndexedEmbedded
includePaths de @IndexedEmbedded » vous permet de rechercher une classe Person par name (prénom) et/ou surname (nom de famille), et/ou le name d'un parent. Le surname du parent ne sera pas indexé, la recherche des noms de famille d'un parent sera donc impossible mais cela accélèrera l'indexation, économisera de l'espace et améliorera la performance générale.
includePaths de @IndexedEmbedded incluera les chemins spécifiés en plus de que vous indexeriez normalement en spécifiant une valeur limitée pour depth. Lorsque vous utilisez includePaths et laissez depth indéfini, le comportement est équivalent à une configuration depth=0 : seuls les chemins inclus sont indexés.
Exemple 13.16. Utilisation de la propriété includePaths de @IndexedEmbedded
includePaths de @IndexedEmbedded », chaque humain aura les attributs de son nom et nom de famille indexés. Le nom et nom de famille des parents sera également indexé, de manière récursive jusqu'à la seconde ligne à cause de l'attribut de la méthode depth. Il sera possible de rechercher par nom et nom de famille, de la personne directement, de ses parents ou grands-parents. Au-delà du second niveau, nous indexerons également un niveau supplémentaire mais uniquement le nom, pas le nom de famille.
id: comme clé primaire_hibernate_class: stocke le type d'entiténame: comme champ directsurname: comme champ directparents.name: comme champ intégré à profondeur 1parents.surname: comme champ intégré à profondeur 1parents.parents.name: comme champ intégré à profondeur 2parents.parents.surname: comme champ intégré à profondeur 2parents.parents.parents.name: comme chemin supplémentaire tel que spécifié parincludePaths. Le premierparents.est déduit à partir du nom de champ, le reste du chemin est l'attribut deincludePaths
13.2.2. Boosting Copier lienLien copié sur presse-papiers!
13.2.2.1. Boosting de temps d'indexation statique Copier lienLien copié sur presse-papiers!
@Boost. Vous pouvez utiliser cette annotation dans @Field ou l'indiquer directement au niveau méthode ou classe.
Exemple 13.17. Les différentes façons d'utiliser @Boost
Essay's d'atteindre le haut de la liste de recherche seront multipliées par 1.7. Le champ summary sera 3 fois (2 x 1.5, car @Field.boost et @Boost sont cumulatifs sur une propriété) plus important que le champ isbn. Le champ text sera 1,2 fois plus important que le champ isbn. Veuillez noter que cette explication est fausse en théorie, mais elle est simple et proche de la réalité en pratique.
13.2.2.2. Boosting de temps d'indexation dynamique Copier lienLien copié sur presse-papiers!
@Boost utilisée dans Section 13.2.2.1, « Boosting de temps d'indexation statique » définit un facteur de boost statique indépendant du statut de l'entité indexée au temps d'exécution. Il existe cependant des cas d'utilisation dans lesquels le facteur de boosting peut dépendre du statut actuel de l'entité. Vous pouvez alors utiliser l'annotation @DynamicBoost avec une BoostStrategy personnalisée.
Exemple 13.18. Exemple de boosting dynamique
VIPBoostStrategy comme implémentation de l'interface BoostStrategy à utiliser au moment de l'indexation. Vous pouvez placer @DynamicBoost au niveau class ou au niveau champ. Selon l'emplacement de l'annotation, l'entité entière passera à la méthode defineBoost, ou uniquement la valeur de champ/propriété annotée. C'est à vous d'envoyer l'objet passé au type approprié. Dans cet exemple, toutes les valeurs indexées d'une personne VIP seront deux fois plus importantes que les valeurs d'une personne normale.
Note
BoostStrategy spécifiée doit définir un constructeur public no-arg par défaut.
@Boost et @DynamicBoost comme vous le souhaitez dans votre entité. Tous les facteurs boost définis sont cumulatifs.
13.2.3. Analyse Copier lienLien copié sur presse-papiers!
Analysis, qui consiste à convertir un texte en termes uniques (mots), est considéré comme l'une des fonctionnalités les plus importantes d'un moteur de recherche en texte intégral. Lucene utilise le concept des Analyzers pour contrôler ce procédé. La section suivante décrit les différentes façons offertes par Hibernate Search pour configurer ces analyseurs.
13.2.3.1. Analyseur par défaut et analyseur par classe Copier lienLien copié sur presse-papiers!
hibernate.search.analyzer. La valeur par défaut pour cette propriété est org.apache.lucene.analysis.standard.StandardAnalyzer.
Exemple 13.19. Les différentes façons d'utiliser @Analyzer
EntityAnalyzer est utilisé pour indexer la propriété segmentée (name), sauf summary et body qui sont indexés respectivement avec PropertyAnalyzer et FieldAnalyzer.
Avertissement
13.2.3.2. Analyseurs nommés Copier lienLien copié sur presse-papiers!
@Analyzer et est composée de :
- un nom : la chaîne unique utilisée pour faire référence à la définition
- une liste de filtres de caractères : chaque filtre de caractère est chargé d'effectuer un pré-traitement des caractères d'entrée avant la génération de jetons. Les filtres de caractère servent à ajouter, modifier, supprimer ou normaliser des caractères.
- un générateur de jetons : sert à découper le flux d'entrée en mots individuels
- une liste de filtres : chaque filtre permet de supprimer, modifier ou même ajouter des mots dans le flux fourni par le générateur de jetons.
Tokenizer démarre la génération de jetons en changeant l'entrée de caractère en jetons qui seront ensuite traités par les TokenFilters. Hibernate Search prend en charge cette infrastructure en utilisant le framework d'analyseur Solr.
Note
lucene-snowball et pour la classe PhoneticFilterFactory, vous aurez besoin du JAR commons-codec. Votre distribution de Hibernate Search fournit ces dépendances dans son répertoire lib/optional.
@AnalyzerDef et le framework Solr ». Un filtre de caractère est d'abord défini par sa fabrique. Dans notre exemple, nous utilisons un filtre de caractère de mappage, et les caractères seront remplacés dans l'entrée basée sur les règles spécifiées dans le fichier de mappage. Puis un générateur de jetons est défini. Cet exemple utilise le générateur de jetons standard. Pour finir, une liste de filtres est définie par leur fabrique. Dans notre exemple, le filtre StopFilter est généré en lisant le fichier de propriété du mot en question. Le filtre ignore la casse.
Exemple 13.20. @AnalyzerDef et le framework Solr
Note
@AnalyzerDef. L'ordre est important.
resource_charset.
Exemple 13.21. Utilisez un jeu de caractères spécifique pour charger le fichier de propriété.
@Analyzer tel que dans l'Exemple 13.22, « Référencer un analyseur par nom. ».
Exemple 13.22. Référencer un analyseur par nom.
@AnalyzerDef sont également disponibles par leur nom dans la classe SearchFactory, ce qui est utile lors de la génération de requêtes.
Analyzer analyzer = fullTextSession.getSearchFactory().getAnalyzer("customanalyzer");
Analyzer analyzer = fullTextSession.getSearchFactory().getAnalyzer("customanalyzer");
13.2.3.3. Analyseurs disponibles Copier lienLien copié sur presse-papiers!
| Fabrique | Description | Paramètres | Dépendances supplémentaires |
|---|---|---|---|
MappingCharFilterFactory | Remplace un ou plusieurs caractères par un ou plusieurs caractères, selon les mappages spécifiés dans le fichier ressource. | mapping : dirige vers un fichier ressource contenant les mappages utilisant le format :
| aucun |
HTMLStripCharFilterFactory | Supprimer les balises HTML ordinaires, en gardant le texte | aucun | aucun |
| Fabrique | Description | Paramètres | Dépendances supplémentaires |
|---|---|---|---|
StandardTokenizerFactory | Utiliser le générateur de jetons standard de Lucene | aucun | aucun |
HTMLStripCharFilterFactory | Supprimer les balises HTML, garder le texte et le passer à un StandardTokenizer (Générateur de jetons standard). | aucun | solr-core |
PatternTokenizerFactory | Divise le texte selon le modèle d'expression régulière spécifié. | pattern : l'expression régulière à utiliser pour générer des jetons
group : indique le groupe de modèle à extraire en jetons
| solr-core |
| Fabrique | Description | Paramètres | Dépendances supplémentaires |
|---|---|---|---|
StandardFilterFactory | Supprimer les points des acronymes et les apostrophes des mots. | aucun | solr-core |
LowerCaseFilterFactory | Mettre tous les termes en minuscules | aucun | solr-core |
StopFilterFactory | Supprime les mots (jetons) correspondant à une liste de mots vides | words : dirige vers un fichier ressource contenant les mots vides
ignoreCase : true (vrai) si la
casse doit être ignoré lors de la comparaison des mots vides, false (faux) le reste du temps
| solr-core |
SnowballPorterFilterFactory | Réduit un mot à sa racine dans une langue donnée. Par exemple, les termes protéger, protège et protection partagent la même racine. Ce filtre permet d'obtenir des résultats de recherche contenant des termes correspondants. | language : allemand, anglais, danois, espagnol, finnois, français, italien, norvégien, portugais, russe, suédois et autres | solr-core |
ISOLatin1AccentFilterFactory | Supprimer les accents pour les langues telles que le français | aucun | solr-core |
PhoneticFilterFactory | Insère des jetons phonétiquement similaires dans le flux de jetons | encoder : un de DoubleMetaphone, Metaphone, Soundex ou RefinedSoundex
injecter :
true ajoutera des jetons au flux, false remplacera le jeton existant
maxCodeLength : définit la longueur maximale du code à générer. Pris en charge uniquement pour les codages Metaphone et DoubleMetaphone
| solr-core et commons-codec |
CollationKeyFilterFactory | Convertit chaque jeton en son java.text.CollationKey puis code la classe CollationKey avec IndexableBinaryStringTools, pour lui permettre d'être stocké comme terme d'index. | custom, language, country, variant, strength, decomposition. Pour plus d'informations, veuillez consulter les javadocs CollationKeyFilter de Lucene. | solr-core et commons-io |
org.apache.solr.analysis.TokenizerFactory et org.apache.solr.analysis.TokenFilterFactory dans votre IDE pour voir les implémentations disponibles.
13.2.3.4. Sélection d'analyseur dynamique Copier lienLien copié sur presse-papiers!
BlogEntry, l'analyseur peut dépendre de la propriété de la langue de l'entrée. Selon la propriété, la bonne racinisation linguistique doit être choisie pour indexer le texte.
AnalyzerDiscriminator. Exemple 13.23, « Utilisation de @AnalyzerDiscriminator » décrit l'utilisation de cette annotation.
Exemple 13.23. Utilisation de @AnalyzerDiscriminator
@AnalyzerDiscriminator, tous les analyseurs à utiliser dynamiquement doivent être prédéfinis dans les définitions @AnalyzerDef. Si tel est le cas, l'annotation @AnalyzerDiscriminator peut être placée sur une classe ou sur une propriété spécifique de l'entité pour laquelle sélectionner un analyseur. Le paramètre impl de AnalyzerDiscriminator vous permet de spécifier une mise en œuvre concrète de l'interface Discriminator. Il vous revient de fournir une mise en œuvre pour cette interface. La seule méthode à mettre en œuvre est getAnalyzerDefinitionName(), utilisée à chaque champ ajouté au document Lucene. L'entité indexée passe également par la méthode d'interface. Le paramètre value n'est déterminé que si AnalyzerDiscriminator est placé au niveau propriété plutôt que classe. Dans ce cas là, la valeur représente la valeur actuelle de cette propriété.
Discriminator doit renvoyer le nom d'une définition d'analyseur existante ou null si l'analyseur par défaut ne doit pas être remplacé. Exemple 13.23, « Utilisation de @AnalyzerDiscriminator » part du principe que le paramètre de langue est 'de' ou 'en' correspondant aux noms spécifiés dans @AnalyzerDefs.
13.2.3.5. Récupération d'un analyseur Copier lienLien copié sur presse-papiers!
Note
Exemple 13.24. Utilisation de l'analyseur étendu lors de la création d'une requête de texte intégral
title et un analyseur de radical est utilisé dans le champ title_stemmed. En utilisant l'analyseur fourni par la fabrique de recherche, la requête utilise l'analyseur approprié selon le champ ciblé.
Note
@AnalyzerDef par le nom de leur définition en utilisant searchFactory.getAnalyzer(String).
13.2.4. Ponts Copier lienLien copié sur presse-papiers!
@Field doivent être converties en chaînes à indexer. La raison pour laquelle ce détail n'a pas été mentionné jusqu'à présent est que pour la plupart de vos propriétés Hibernate Search effectue la traduction pour vous grâce à un ensemble de ponts intégrés. Cependant, il vous faudra quelque fois exercer un contrôle plus détaillé du procédé de traduction.
13.2.4.1. Ponts intégrés Copier lienLien copié sur presse-papiers!
- null
- Par défaut, les éléments
nullne sont pas indexés. Lucene ne prend pas en charge les éléments nuls. Il peut cependant être utile dans certaines situations d'insérer un jeton personnalisé représentant la valeurnull. Pour plus d'informations, veuillez consulter Section 13.2.1.1.2, « @Field ». - java.lang.String
- Les chaînes sont indexées telles quelles
- short, Short, integer, Integer, long, Long, float, Float, double, Double, BigInteger, BigDecimal (court, Court, entier, Entier, long, Long, flottant, Flottant, double, Double, BigInteger, BigDecimal)
- Les nombres sont convertis en leur représentation de chaîne. Veuillez noter que les nombres ne peuvent pas être comparés par Lucene (c'est-à-dire utilisés en requêtes de plage de données) immédiatement : ils doivent être remplis.
Note
L'utilisation d'une requête de plage de données présente des inconvénients. Une alternative consiste à utiliser une requête de filtre qui filtrera la requête de résultat à la plage qui convient.Hibernate Search prend également en charge l'utilisation d'un StringBridge personnalisé tel que décrit dans la Section 13.2.4.2, « Ponts personnalisés ». - java.util.Date
- Les dates suivent le modèle yyyyMMddHHmmssSSS sur le fuseau horaire GMT (par exemple, 200611072203012 pour le 7 novembre 2006 à 16h03 et 12ms EST). Le format interne n'est pas très important. Ce qui compte, c'est que lorsque vous utilisez un TermRangeQuery, vous devez savoir que les dates doivent être exprimées en heure GMT.Il n'est généralement pas nécessaire d'enregistrer la date à la milliseconde près.
@DateBridgedéfinit la résolution que vous souhaitez enregistrer dans l'index (@DateBridge(resolution=Resolution.DAY)). Le modèle de date sera ensuite tronqué en conséquence.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Avertissement
Une date dont la résolution est inférieure àMILLISECONDne peut pas être un@DocumentIdImportant
Le pont par défautDateutilise lesDateToolsde Lucene pour convertir depuis et versString. Cela signifie que toutes les dates sont exprimées en heure GMT. Si vous devez enregistrer vos dates dans un fuseau horaire défini, vous devrez alors mettre en œuvre un pont de date personnalisé. Veuillez vous assurer de comprendre les pré-requis de vos applications en ce qui concerne l'indexation et recherche de date. - java.net.URI, java.net.URL
- Les URI et URL sont convertis à leur représentation de chaîne.
- java.lang.Class
- Les classes sont converties à leur nom de classe entier. Le chargeur de classe de contexte de thread est utilisé lorsque la classe est réhydratée.
13.2.4.2. Ponts personnalisés Copier lienLien copié sur presse-papiers!
13.2.4.2.1. StringBridge Copier lienLien copié sur presse-papiers!
Object attendu au String que vous souhaitez. Pour ce faire, veuillez mettre en œuvre l'interface org.hibernate.search.bridge.StringBridge. Toutes les implémentations doivent être thread-safe à cause de la nature simultanée de leur utilisation.
Exemple 13.25. Implémentation de StringBridge personnalisée
StringBridge personnalisée », toute propriété ou champ peut utiliser ce pont à l'aide de l'annotation @FieldBridge :
@FieldBridge(impl = PaddedIntegerBridge.class) private Integer length;
@FieldBridge(impl = PaddedIntegerBridge.class)
private Integer length;
13.2.4.2.2. Pont paramétré Copier lienLien copié sur presse-papiers!
ParameterizedBridge et les paramètres sont transmis par l'annotation @FieldBridge.
Exemple 13.26. Transmettre des paramètres vers votre pont mis en œuvre
ParameterizedBridge peut être mise en œuvre par StringBridge, TwoWayStringBridge et FieldBridge.
13.2.4.2.3. Connaissance du type de pont Copier lienLien copié sur presse-papiers!
- le type de retour de la propriété pour les ponts champ/niveau getter
- le type de classe pour les ponts de niveau classe
AppliedOnTypeAwareBridge verront le type sur lequel le pont est appliqué se faire injecter. Comme pour les paramètres, il n'est pas nécessaire d'accorder trop d'importance à la sécurité de thread du type injecté.
13.2.4.2.4. Pont bidirectionnel Copier lienLien copié sur presse-papiers!
@DocumentId ), vous devrez utiliser une version légèrement étendue de StringBridge appelée TwoWayStringBridge. Hibernate Search doit lire la représentation de chaîne de l'identifiant et en générer l'objet. Il n'y a aucune différence dans la façon d'utiliser l'annotation @FieldBridge.
Exemple 13.27. Implémentation d'un TwoWayStringBridge (pont bidirectionnel) utilisable avec les propriétés d'ID
Important
13.2.4.2.5. FieldBridge Copier lienLien copié sur presse-papiers!
FieldBridge. Cette interface vous donne une valeur de propriété et vous laisse la mapper à votre manière dans votre Document Lucene. Vous pouvez par exemple stocker une propriété en deux champs de document différents. L'interface est très similaire dans son concept aux UserTypes de Hibernate.
Exemple 13.28. Mettre en œuvre l'interface FieldBridge
LuceneOptions ; cet assistant appliquera les options que vous avez sélectionnées sur @Field, comme Store ou TermVector, ou appliquera la valeur @Boost choisie, ce qui est particulièrement utile pour encapsuler la complexité des implémentations COMPRESS. Bien qu'il soit recommandé de déléguer à LuceneOptions l'ajout des champs au Document, rien ne vous empêche de modifier le Document directement et d'ignorer LuceneOptions le cas échéant.
Note
LuceneOptions sont créées pour protéger votre application des changements survenus dans l'API Lucene et pour simplifier votre code. Utilisez-les si vous voulez, sauf si vous souhaitez davantage de flexibilité.
13.2.4.2.6. ClassBridge Copier lienLien copié sur presse-papiers!
@ClassBridge et les annotations @ClassBridges respectives peuvent être définis au niveau de la classe (et non pas au niveau propriété). Dans ce cas, l'implémentation du pont reçoit l'instance d'entité comme valeur de paramètre au lieu d'une valeur de propriété en particulier. Bien que cela ne soit pas montré dans Exemple 13.29, « Implémentation d'un pont de classe », @ClassBridge supporte l'attribut termVector discuté dans la section Section 13.2.1.1, « Mappage de base ».
Exemple 13.29. Implémentation d'un pont de classe
CatFieldsClassBridge particulière est appliquée à l'instance department, le pont de champ concatène ensuite la branche et le réseau et indexe la concaténation.
13.3. Recherche Copier lienLien copié sur presse-papiers!
- La création d'une
FullTextSession - La création d'une requête Lucene à l'aide de la DSL de requête Hibernate Search (recommandé) ou l'API de requête Lucene
- L'inclusion d'une requête Lucene avec
org.hibernate.Query - L'exécution de la recherche en appelant par exemple
list()ouscroll()
FullTextSession. Cette session spécifique à la recherche inclut une classe org.hibernate.Session régulière afin de fournir une requête et des capacités d'indexation.
Exemple 13.30. Création d'une FullTextSession
Session session = sessionFactory.openSession(); ... FullTextSession fullTextSession = Search.getFullTextSession(session);
Session session = sessionFactory.openSession();
...
FullTextSession fullTextSession = Search.getFullTextSession(session);
FullTextSession pour construire une requête en texte intégral en utilisant la DSL de requête Hibernate Search ou la requête Lucene native.
Exemple 13.31. Création d'une requête Lucene à l'aide de QueryParser
org.hibernate.Query. Cette requête demeure dans le même paradigme que d'autres fonctions de requête Hibernate, telles que HQL (Hibernate Query Language), Native et Criteria. Utilisez des méthodes telles que list(), uniqueResult(), iterate() et scroll() avec la requête.
Exemple 13.32. Création d'une requête de recherche à l'aide de l'API JPA
Note
FullTextQuery est extraite.
13.3.1. Création de requêtes Copier lienLien copié sur presse-papiers!
13.3.1.1. Générer une requête Lucene avec l'API Lucene Copier lienLien copié sur presse-papiers!
13.3.1.2. Génération d'une requête Lucene Copier lienLien copié sur presse-papiers!
QueryBuilder pour cette tâche.
- Les noms de méthodes sont en anglais. Ainsi, les opérations API peuvent être lues et comprises comme une série d'expressions et instructions en anglais.
- Elle utilise le complètement automatique IDE ce qui facilite les complètements pour le préfixe d'entrée actuel et permet à l'utilisateur de choisir l'option qui convient.
- Elle utilise souvent le modèle de la méthode de chaîne.
- Les opérations API sont faciles à lire et à utiliser.
indexedentitytype donné. Ce QueryBuilder sait quel analyseur utiliser et quel pont de champ appliquer. Plusieurs QueryBuilder (un pour chaque type d'entité impliqué dans la racine de votre requête) peuvent être créés. Le QueryBuilder provient de SearchFactory.
QueryBuilder mythQB = searchFactory.buildQueryBuilder().forEntity( Myth.class ).get();
QueryBuilder mythQB = searchFactory.buildQueryBuilder().forEntity( Myth.class ).get();
QueryBuilder mythQB = searchFactory.buildQueryBuilder()
.forEntity( Myth.class )
.overridesForField("history","stem_analyzer_definition")
.get();
QueryBuilder mythQB = searchFactory.buildQueryBuilder()
.forEntity( Myth.class )
.overridesForField("history","stem_analyzer_definition")
.get();
Query assemblés avec l'API programmée de Lucene sont utilisées avec Hibernate Search DSL.
13.3.1.3. Requêtes de mots-clés Copier lienLien copié sur presse-papiers!
Query luceneQuery = mythQB.keyword().onField("history").matching("storm").createQuery();
Query luceneQuery = mythQB.keyword().onField("history").matching("storm").createQuery();
| Paramètre | Description |
|---|---|
| keyword() | Utilisez ce paramètre pour trouver un mot spécifique |
| onField() | Utilisez ce paramètre pour spécifier le champ Lucene dans lequel rechercher le mot |
| matching() | Utilisez ce paramètre pour spécifier la correspondance pour chaque chaîne |
| createQuery() | Crée l'objet de requête de Lucene |
- La valeur « storm » est transmise à la classe
historyFieldBridge, ce qui est utile lorsque les nombres ou dates sont impliqués. - La valeur de pont du champ est ensuite transmise à l'analyseur utilisé pour indexer le champ
history, ce qui permet de garantir que la requête utilise la même transformation de terme que l'indexation (bas de casse, ngram, analyse de radical etc.). Si le processus d'analyse génère plusieurs termes pour un même mot, une requête booléenne sera utilisée avec la logiqueSHOULD(semblable à une logiqueOR).
Note
Date devait être converti en sa représentation de chaîne (dans ce cas-là, l'année)
FieldBridge ait une méthode objectToString (ce qui est le cas pour toutes les mises en œuvre FieldBridge intégrées).
y). Tout cela est fait de manière transparente pour l'utilisateur.
Note
ignoreAnalyzer() ou ignoreFieldBridge() peuvent être appelées.
//search document with storm or lightning in their history
Query luceneQuery =
mythQB.keyword().onField("history").matching("storm lightning").createQuery();
//search document with storm or lightning in their history
Query luceneQuery =
mythQB.keyword().onField("history").matching("storm lightning").createQuery();
onFields.
Query luceneQuery = mythQB
.keyword()
.onFields("history","description","name")
.matching("storm")
.createQuery();
Query luceneQuery = mythQB
.keyword()
.onFields("history","description","name")
.matching("storm")
.createQuery();
andField().
13.3.1.4. Requêtes Fuzzy (approximatives) Copier lienLien copié sur presse-papiers!
keyword et ajoutez l'indicateur fuzzy.
threshold est la limite au-dessus de laquelle deux termes sont considérés comme correspondant. Il s'agit d'une décimal entre 0 et 1 et la valeur par défaut est 0.5. Le prefixLength est la longueur du préfix ignoré par l'« approximation ». Bien que la valeur par défaut soit 0, une valeur autre que 0 est recommandée pour les indexes contenant un grand nombre de termes distincts.
13.3.1.5. Requêtes Wildcard Copier lienLien copié sur presse-papiers!
? représente un caractère unique et * représente plusieurs caractères. Veuillez noter que dans un soucis de performance, il est recommandé que la requête ne commence pas par ? ou *.
Note
* ou ? altéré est trop grand.
13.3.1.6. Requêtes de phrase Copier lienLien copié sur presse-papiers!
phrase().
Query luceneQuery = mythQB
.phrase()
.onField("history")
.sentence("Thou shalt not kill")
.createQuery();
Query luceneQuery = mythQB
.phrase()
.onField("history")
.sentence("Thou shalt not kill")
.createQuery();
13.3.1.7. Requêtes de portée Copier lienLien copié sur presse-papiers!
13.3.1.8. Association de requêtes Copier lienLien copié sur presse-papiers!
SHOULD(devrait) : la requête devrait contenir les éléments de correspondance de la sous-requête.MUST(doit) : la requête doit contenir les éléments correspondants de la sous-requête.MUST NOT(ne doit pas) : la requête ne doit pas contenir les éléments correspondants de la sous-requête.
Exemple 13.33. Requête MUST NOT
Exemple 13.34. Requête SHOULD
Exemple 13.35. Requête NOT
13.3.1.9. Options de requête Copier lienLien copié sur presse-papiers!
- La méthode
boostedTo(sur les champs et types de requêtes) booste la requête entière ou le champ spécifique vers un facteur donné. - La méthode
withConstantScore(sur requête) renvoie tous les résultats correspondants à la requête ayant un score égal au boost. - La méthode
filteredBy(Filter)(sur requête) filtre les résultats de requêtes à l'aide de l'instanceFilter. - La méthode
ignoreAnalyzer(sur champ) ignore l'analyseur lors du traitement de ce champ. - La méthode
ignoreFieldBridge(sur champ) ignore le pont de champ lors du traitement de ce champ.
Exemple 13.36. Associations d'options de requêtes
13.3.1.10. Créer une requête Hibernate Search Copier lienLien copié sur presse-papiers!
13.3.1.10.1. Généralités Copier lienLien copié sur presse-papiers!
Exemple 13.37. Inclure une requête Lucene dans une requête Hibernate.
FullTextSession fullTextSession = Search.getFullTextSession( session ); org.hibernate.Query fullTextQuery = fullTextSession.createFullTextQuery( luceneQuery );
FullTextSession fullTextSession = Search.getFullTextSession( session );
org.hibernate.Query fullTextQuery = fullTextSession.createFullTextQuery( luceneQuery );
Exemple 13.38. Filtrage des résultats de la recherche par type d'entité
Customer correspondants. La seconde partie du même exemple renvoie des Actor et Item correspondants. La restriction de type est polymorphe. Ainsi, si les deux sous-classes Salesman et Customer de la classe de base Person apparaissent dans les résultats, spécifiez Person.class pour filtre sur la base des types de résultat.
13.3.1.10.2. Pagination Copier lienLien copié sur presse-papiers!
Exemple 13.39. Définir une pagination pour une requête de recherche
org.hibernate.Query fullTextQuery =
fullTextSession.createFullTextQuery( luceneQuery, Customer.class );
fullTextQuery.setFirstResult(15); //start from the 15th element
fullTextQuery.setMaxResults(10); //return 10 elements
org.hibernate.Query fullTextQuery =
fullTextSession.createFullTextQuery( luceneQuery, Customer.class );
fullTextQuery.setFirstResult(15); //start from the 15th element
fullTextQuery.setMaxResults(10); //return 10 elements
Note
fulltextQuery.getResultSize()
13.3.1.10.3. Tri Copier lienLien copié sur presse-papiers!
Exemple 13.40. Spécifier un Sort Lucene
Note
13.3.1.10.4. Stratégie de récupération Copier lienLien copié sur presse-papiers!
Exemple 13.41. Spécification de FetchMode dans une requête
Criteria criteria =
s.createCriteria( Book.class ).setFetchMode( "authors", FetchMode.JOIN );
s.createFullTextQuery( luceneQuery ).setCriteriaQuery( criteria );
Criteria criteria =
s.createCriteria( Book.class ).setFetchMode( "authors", FetchMode.JOIN );
s.createFullTextQuery( luceneQuery ).setCriteriaQuery( criteria );
Important
Criteria car la méthode getResultSize() émet une SearchException lorsqu'elle est utilisée en association avec une classe Criteria avec restriction.
setCriteriaQuery.
13.3.1.10.5. Projection Copier lienLien copié sur presse-papiers!
Object[]. Les projections permettent d'éviter les longs allers-retours dans la base de données, mais elles présentent également les contraintes suivantes :
- Les propriétés projetées doivent être stockées dans l'index (
@Field(store=Store.YES)), ce qui augmente la taille de l'index. - Les propriétés projetées doivent utiliser un
FieldBridgemettant en œuvreorg.hibernate.search.bridge.TwoWayFieldBridgeouorg.hibernate.search.bridge.TwoWayStringBridge, ce dernier étant la version la plus simple.Note
Tous les types d'Hibernate Search intégrés sont bidirectionnels. - Seules les propriétés simples de l'entité indexée ou de ses associations intégrées peuvent être projetées : une entité entière intégrée ne peut donc pas être projetée.
- La projection ne fonctionne pas sur les collections ou cartes indexées par le biais de
@IndexedEmbedded
Exemple 13.42. Utilisation de la projection pour récupérer les métadonnées
FullTextQuery.THIS: renvoie l'entité gérée et initialisée (tel que l'aurait fait une requête non projetée).FullTextQuery.DOCUMENT: renvoie le document Lucene lié à l'objet projeté.FullTextQuery.OBJECT_CLASS: renvoie la classe de l'entité indexée.FullTextQuery.SCORE: renvoie le score du document dans la requête. Les scores sont utiles pour comparer deux résultats d'une requête donnée, mais sont inutiles pour comparer le résultat de différentes requêtes.FullTextQuery.ID: la valeur de propriété de l'ID de l'objet projeté.FullTextQuery.DOCUMENT_ID: l'ID du document Lucene. Utilisez cette valeur avec précaution car un ID de document Lucene peut changer entre deux ouvertures IndexReader différentes.FullTextQuery.EXPLANATION: renvoie l'objet d'explication Lucene pour l'objet/document correspondant dans une requête donnée mais ne convient pas à la récupération de grandes quantités de données. L'exécution d'explication coûte autant que d'exécuter la requête Lucene entière par élément correspondant. La projection est donc recommandée.
13.3.1.10.6. Personnalisation de stratégies d'initialisation d'objet Copier lienLien copié sur presse-papiers!
Exemple 13.43. Vérifiez le cache de secon niveau avant d'utiliser une requête
FullTextQuery query = session.createFullTextQuery(luceneQuery, User.class);
query.initializeObjectWith(
ObjectLookupMethod.SECOND_LEVEL_CACHE,
DatabaseRetrievalMethod.QUERY
);
FullTextQuery query = session.createFullTextQuery(luceneQuery, User.class);
query.initializeObjectWith(
ObjectLookupMethod.SECOND_LEVEL_CACHE,
DatabaseRetrievalMethod.QUERY
);
ObjectLookupMethod définit la stratégie consistant à vérifier si un objet est facilement accessible (sans avoir à le trouver dans une base de données). Autres options :
ObjectLookupMethod.PERSISTENCE_CONTEXTest utilisé si un grand nombre d'entités correspondantes sont déjà chargées dans le contexte de persistance (chargées dansSessionouEntityManager).ObjectLookupMethod.SECOND_LEVEL_CACHEvérifie le contexte de persistance puis le cache de second niveau.
- Configurez et activez correctement le cache de second niveau.
- Activez le cache de second niveau pour l'entité souhaitée à l'aide d'annotations telles que
@Cacheable. - Activez l'accès de lecture de cache de second niveau pour
Session,EntityManagerouQuery. UtilisezCacheMode.NORMALdans les API natives de Hibernate ouCacheRetrieveMode.USEdans les API de Persistance Java.
Avertissement
ObjectLookupMethod.SECOND_LEVEL_CACHE. D'autres fournisseurs de cache de second niveau ne mettent pas en œuvre cette opération de manière efficace.
DatabaseRetrievalMethod comme suit :
QUERY(par défaut) utilise un ensemble de requêtes pour charger différents objets dans chaque lot. Cette approche est recommandée.FIND_BY_IDcharge un objet à la fois à l'aide de la sémantiqueSession.getouEntityManager.find. Cette approche est recommandée si la taille du lot est définie pour l'entité, ce qui permet à Hibernate Core de charger des entités par lots.
13.3.1.10.7. Limiter le temps d'une requête Copier lienLien copié sur presse-papiers!
- Lever une exception lorsque la limite est atteinte.
- Limiter au nombre de résultats récupérés lorsque la limite de temps est levée
13.3.1.10.8. Lever une Exception de Limite de temps Copier lienLien copié sur presse-papiers!
QueryTimeoutException est levée (org.hibernate.QueryTimeoutException ou javax.persistence.QueryTimeoutException suivant l'API programmatique).
Exemple 13.44. Définition d'un Timeout dans une exécution de requête
getResultSize(), iterate() et scroll() respectent le timeout jusqu'à la fin de la méthode. C'est pourquoi Iterable ou ScrollableResults ignorent le timeout. De plus, la méthode explain() ne respecte pas cette période de timeout. Cette méthode est utilisée pour déboguer et pour vérifier les raisons derrière la contre-performance d'une requête.
Exemple 13.45. Définition d'un Timeout dans une exécution de requête
Important
13.3.2. Récupération des résultats Copier lienLien copié sur presse-papiers!
list(), uniqueResult(), iterate() et scroll() sont disponibles.
13.3.2.1. Performance Copier lienLien copié sur presse-papiers!
list() ou uniqueResult() sont recommandés. list() fonctionne mieux si l'entité batch-size est configurée correctement. Veuillez noter que Hibernate Search doit traiter tous les éléments Lucene Hits (dans la pagination) lors de l'utilisation de list(), uniqueResult() et iterate().
scroll(). Veillez à fermer l'objet ScrollableResults lorsque vous aurez terminé, puisqu'il garde les ressources Lucene. Si vous comptez utiliser la méthode scroll, mais souhaitez charger des objets en lot, vous pouvez utiliser query.setFetchSize(). Lorsqu'on accède à un objet mais qu'il n'est pas encore chargé, Hibernate Search charge les objets qui suivent fetchSize en une seule fois.
Important
13.3.2.2. Taille des résultats Copier lienLien copié sur presse-papiers!
- pour la fonctionnalité de type Google "1-10 sur environ 888 000 000"
- pour implémenter une navigation de pagination rapide ;
- pour mettre en place un moteur de recherche à plusieurs étapes (ajout d'une approximation si la requête restreinte renvoie peu ou pas de résultats) ;
- pour fournir une fonctionnalité de résultat total de la recherche, comme pour une recherche Google. Par exemple, « 1-10 sur environ 888 000 000 résultats » ;
- pour mettre en place une navigation de pagination rapide ;
- pour mettre en place un moteur de recherche à plusieurs étapes qui ajoute une approximation si la requête restreinte renvoie peu ou pas de résultats ;
Exemple 13.46. Détermination de la taille des résultats d'une requête
Note
13.3.2.3. ResultTransformer Copier lienLien copié sur presse-papiers!
Object. Si la structure des données utilisée pour l'objet ne correspond pas aux pré-requis de l'application, appliquez une classe ResultTransformer. La classe ResultTransformer génère la structure de données requise après l'exécution de la requête.
Exemple 13.47. Utilisation de ResultTransformer avec projections
ResultTransformer se trouvent dans la base de codes Hibernate Core.
13.3.2.4. Interprétation des résultats Copier lienLien copié sur presse-papiers!
Luke vous aidera à les déchiffrer. Cependant, Hibernate Search vous donnera également accès à l'objet Explanation Lucene (dans une requête donnée). Cette classe peut sembler complexe pour certains utilisateurs Lucene mais elle aide à la compréhension de la notation d'un objet. Vous pouvez accéder à l'objet Explanation de deux manières :
- Utiliser la méthode
fullTextQuery.explain(int) - Utiliser la projection
FullTextQuery.DOCUMENT_ID.
Avertissement
Explanation à l'aide de la constante FullTextQuery.EXPLANATION.
Exemple 13.48. Récupération de l'objet Explanation de Lucene à l'aide d'une projection
13.3.3. Filters Copier lienLien copié sur presse-papiers!
- sécurité
- données temporelles (par exemple, afficher uniquement les données du mois précédent)
- filtre de population (par exemple, recherche limitée à une catégorie donnée)
13.3.3.1. Utilisation des filtres dans un environnement partitionné Copier lienLien copié sur presse-papiers!
Procédure 13.1. Requête de sous-ensemble de partitions d'index
- Créer une stratégie de partitionnement qui sélectionne un sous-ensemble de
IndexManagers selon la configuration du filtre. - Activer le filtre au moment de la requête.
Exemple 13.49. Requête de sous-ensemble de partitions d'index
customer (client) est activé.
customer est présent, seule la partition consacrée à ce client sera requise, sinon, toutes les partitions seront retournées. Une stratégie de partitionnement donnée peut réagir à un ou plusieurs filtres et dépendra de ces paramètres.
ShardSensitiveOnlyFilter lorsque vous indiquez votre filtre.
ShardSensitiveOnlyFilter, vous n'aurez pas besoin de mettre en place un filtre Lucene. L'utilisation de filtres et d'une stratégie de partitionnement réagissant à ces filtres est recommandée pour accélérer les requêtes dans un environnement partitionné.
13.3.4. Requêtes de facette Copier lienLien copié sur presse-papiers!
Exemple 13.50. Recherche Hibernate Search sur Amazon
QueryBuilder et FullTextQuery sont le point d'entrée dans l'API de facette. Le premier crée des requêtes de facettes et le dernier accède à la classe FacetManager. Le FacetManager applique des requêtes de facette sur une requête et sélectionne des facettes ajoutées à une requête existante pour affiner les résultats de la recherche. Les exemples utilisent l'entité Cd tel que démontré dans Exemple 13.51, « Entité Cd »:
Figure 13.1. Recherche Hibernate Search sur Amazon
Exemple 13.51. Entité Cd
13.3.4.1. Création d'une requête de facette Copier lienLien copié sur presse-papiers!
FacetingRequest. Deux types de requête de facette sont pour l'instant pris en charge. Le premier type s'intitule « discrete faceting » (requête de facette discrète) et le second « range faceting » (requête de facette de gamme). Dans le cas d'une requête de facette discrète, vous devez spécifier le champ d'index sur lequel vous souhaitez effectuer la requête de facette (catégoriser) et les options de requête de facette à appliquer. Vous trouverez un exemple de requête de facette discrète dans Exemple 13.52, « Création d'une requête de facette discrète »:
Exemple 13.52. Création d'une requête de facette discrète
Facet sera créée pour chaque valeur discrète pour le champ indexé label. L'instance Facet enregistrera la valeur de champ réelle en incluant la fréquence à laquelle cette valeur de champ apparaît dans les résultats de requête initiaux. orderedBy, includeZeroCounts et maxFacetCount sont des paramètres facultatifs pouvant être appliqués sur toute requête de facette. orderedBy permet de spécifier l'ordre dans lequel les facettes créées seront renvoyées. La valeur par défaut est FacetSortOrder.COUNT_DESC, mais vous pouvez également trier par valeur de champ ou par l'ordre dans lequel les gammes sont spécifiées. La méthode includeZeroCount détermine si les facettes avec un résultat de 0 seront incluses dans le résultat (elles le seront par défaut) et la méthode maxFacetCount vous permet de limiter le nombre maximal de facettes renvoyées.
Note
String, Date ou un sous-type des valeurs Number et null doivent être évitées. De plus, la propriété doit être indexée avec Analyze.NO et en cas de propriété numérique la classe @NumericField doit être spécifiée.
below et above ne peuvent être spécifiées qu'une fois, mais vous pouvez spécifier autant de from - to que vous le souhaitez. Pour chaque limite de gamme, vous pouvez également spécifier avec excludeLimit si elle est incluse dans la gamme ou non.
Exemple 13.53. Création d'une requête de facette de gamme
13.3.4.2. Application d'une requête de facette Copier lienLien copié sur presse-papiers!
FacetManager qui peut être récupérée par la classe FullTextQuery.
getFacets() en spécifiant le nom de la requête de facette. Il existe également une méthode disableFaceting() qui vous permet de désactiver une requête de facette en spécifiant son nom.
Exemple 13.54. Application d'une requête de facette
13.3.4.3. Restriction des résultats de requête Copier lienLien copié sur presse-papiers!
Facets renvoyées en tant que critère supplémentaire sur votre critère d'origine de manière à mettre en œuvre une fonctionnalité "drill-down" (Résultats détaillés en cascade). FacetSelection peut être utilisé à cette fin. Les FacetSelections sont disponibles sur le FacetManager et vous permettent de sélectionner une facette comme critère de requête (selectFacets), de supprimer une restriction de facette (deselectFacets), de supprimer toutes les restrictions de facette (clearSelectedFacets) et de récupérer toutes les facettes actuellement sélectionnées (getSelectedFacets). Exemple 13.55, « Restreindre des résultats de requête à l'aide de l'application d'une FacetSelection » vous montre un exemple.
Exemple 13.55. Restreindre des résultats de requête à l'aide de l'application d'une FacetSelection
13.3.5. Optimisation des procédés de requête Copier lienLien copié sur presse-papiers!
- La requête Lucene.
- Le nombre d'objets chargés : toujours utiliser la pagination ou la projection d'index (le cas échéant).
- La façon dont Hibernate Search intéragit avec les lecteurs Lucene : définit la stratégie de lecteur appropriée.
- Mise en cache des valeurs extraites fréquemment à partir de l'index : cf. Section 13.3.5.1, « Mise en cache des valeurs d'index : cache du champ »
13.3.5.1. Mise en cache des valeurs d'index : cache du champ Copier lienLien copié sur presse-papiers!
CacheFromIndex vous permet de tester différents types de mise en cache des champs de métadonnées principales requis par Hibernate Search :
CLASS: Hibernate Search utilise un cache de champ Lucene pour améliorer la performance de l'extraction du type de Classe à partir de l'index.Cette valeur est activée par défaut et sera appliquée par Hibernate Search si vous ne précisez pas l'annotation @CacheFromIndex.ID: l'extraction de l'identifiant principal utilisera une mise en cache, ce qui permet l'obtention de meilleurs résultats, mais signifie également que davantage de mémoire sera utilisée et que la performance en sera affectée.
Note
- L'utilisation de la mémoire : ces caches sont de grands consommateurs de mémoire. Le cache CLASS a généralement des besoins moins importants que le cache ID.
- Premières utilisations de l'Index : à l'utilisation des Field Caches, la première requête sur un nouvel index ou segment sera plus lente qu'en l'absence de cache.
CLASS, il ne sera pas utilisé ; par exemple, si vous ciblez une classe simple, tous les résultats seront de ce type (l'évaluation sera exécutée à chaque requête).
TwoWayFieldBridge et chaque type chargé dans une requête spécifique doit utiliser le nom de champ de l'ID et avoir des ID du même type (ceci est évalué à chaque exécution de requête).
13.4. Modifications d'index manuelles Copier lienLien copié sur presse-papiers!
13.4.1. Ajout d'instances à l'index Copier lienLien copié sur presse-papiers!
FullTextSession.index(T entity) vous permet d'ajouter ou de mettre à jour directement une instance d'objet spécifique à l'index. Si cette entité a été déjà été indexée, l'index sera alors mis à jour. Les changements apportés à l'index ne sont appliqués à la validation de la transaction.
Exemple 13.56. Indexation d'une entité avec FullTextSession.index(T entity)
FullTextSession fullTextSession = Search.getFullTextSession(session); Transaction tx = fullTextSession.beginTransaction(); Object customer = fullTextSession.load( Customer.class, 8 ); fullTextSession.index(customer); tx.commit(); //index only updated at commit time
FullTextSession fullTextSession = Search.getFullTextSession(session);
Transaction tx = fullTextSession.beginTransaction();
Object customer = fullTextSession.load( Customer.class, 8 );
fullTextSession.index(customer);
tx.commit(); //index only updated at commit time
MassIndexer : voir Section 13.4.3.2, « Utilisation d'un MassIndexer » pour plus d'informations.
13.4.2. Supprimer des instances d'un index Copier lienLien copié sur presse-papiers!
FullTextSession.
Exemple 13.57. Nettoyage d'une instance spécifique d'une entité à partir de l'index
purgeAll. Cette opération supprime toutes les entités du type transmis comme paramètre ainsi que tous ses sous-types.
Exemple 13.58. Nettoyage de toutes les instances spécifiques d'une entité à partir de l'index
Note
index, purge et purgeAll sont également disponibles sur FullTextEntityManager.
Note
index, purge et purgeAll) affectent uniquement l'index, pas la base de données. Elles sont cependant transactionnelles et ne seront donc appliquées qu'une fois la transaction validée ou si vous utilisez la méthode flushToIndexes.
13.4.3. Reconstruction de l'index Copier lienLien copié sur presse-papiers!
- Utiliser
FullTextSession.flushToIndexes()de manière périodique tout en utilisantFullTextSession.index()sur d'autres entités. - Utiliser un
MassIndexer.
13.4.3.1. Utilisation de flushToIndexes() Copier lienLien copié sur presse-papiers!
FullTextSession.purgeAll() et FullTextSession.index(). Il existe cependant quelques contraintes de mémoire et d'efficacité. Pour garantir une plus grande efficacité, Hibernate Search regroupe les opérations d'index et les exécute au moment de la validation. Si un grand nombre de données doit être indexé, veuiller faire attention à la consommation de la mémoire puisque tous les documents seront placés dans une file d'attente jusqu'à la validation de la transaction. Une erreur intitulée OutOfMemoryException peut apparaître si vous ne videz pas la file d'attente régulièrement, ce que vous pouvez faire à l'aide de fullTextSession.flushToIndexes(). À chaque application de la méthode fullTextSession.flushToIndexes() (ou lorsque la transaction est validée), la file d'attente est traitée et les modifications d'index sont appliquées. Veuillez noter qu'une fois le vidage effectué, les modifications sont irréversibles.
Exemple 13.59. Reconstruction de l'index à l'aide de index() et flushToIndexes()
Note
hibernate.search.default.worker.batch_size a été remplacé par cette API explicite et offrant un meilleur contrôle
13.4.3.2. Utilisation d'un MassIndexer Copier lienLien copié sur presse-papiers!
MassIndexer de Hibernate Search utilise plusieurs threads parallèles pour regénérer l'index. Vous pouvez sélectionner les entités devant être rechargées ou faire en sorte que toutes les entités sont réindexées. Cette approche est optimisée pour une meilleure performance mais nécessite de définir l'application en mode maintenance. Envoyer des requêtes à l'index n'est pas recommandé lorsqu'un MassIndexer est occupé.
Exemple 13.60. Regénérer l'index à l'aide de MassIndexer
fullTextSession.createIndexer().startAndWait();
fullTextSession.createIndexer().startAndWait();
Avertissement
Exemple 13.61. Utilisation d'un MassIndexer réglé.
FieldBridge personnalisés ou des ClassBridge pour sortir un document Lucene. Les threads déclenchent un chargement différé d'attributs supplémentaires pendant le processus de conversion. Pour cette raison, un grand nombre de threads parallèles est requis. Le nombre de threads fonctionnant sur l'écriture d'index est défni dans la confiugration de backend de chaque index.
CacheMode.IGNORE (valeur par défaut), car dans la plupart des situations d'indexation le cache sera une surcharge supplémentaire inutile. Il peut s'avérer utile d'activer un autre CacheMode selon vos données car il pourrait améliorer la performance si l'entité principale est en rapport avec des données de type énumération incluses dans l'index.
Note
Note
hibernate.search.[default|<indexname>].exclusive_index_usehibernate.search.[default|<indexname>].indexwriter.max_buffered_docshibernate.search.[default|<indexname>].indexwriter.max_merge_docshibernate.search.[default|<indexname>].indexwriter.merge_factorhibernate.search.[default|<indexname>].indexwriter.merge_min_sizehibernate.search.[default|<indexname>].indexwriter.merge_max_sizehibernate.search.[default|<indexname>].indexwriter.merge_max_optimize_sizehibernate.search.[default|<indexname>].indexwriter.merge_calibrate_by_deleteshibernate.search.[default|<indexname>].indexwriter.ram_buffer_sizehibernate.search.[default|<indexname>].indexwriter.term_index_interval
max_field_length mais qui a été retiré de Lucene. Il est possible d'obtenir un effet similaire en utilisant LimitTokenCountAnalyzer.
.indexwriter sont spécifiques à Lucene et Hibernate Search utilise ces paramètres.
MassIndexer utilise un résultat déroulant uniquement pour itérer les clés primaires à charger, mais le pilote JDBC de MySQL chargera toutes les valeurs dans la mémoire. Pour éviter cela, cette optimisation définit idFetchSize à Integer.MIN_VALUE.
13.5. Optimisation de l'index Copier lienLien copié sur presse-papiers!
- Sur un système inactif ou lorsque les recherches sont les moins fréquentes.
- Après qu'un grand nombre de modifications d'index ont été appliquées.
MassIndexer (cf. Section 13.4.3.2, « Utilisation d'un MassIndexer ») optimisera les index par défaut au début et à la fin du processus. Vous pouvez changer ce comportement en utilisant respectivement MassIndexer.optimizeAfterPurge et MassIndexer.optimizeOnFinish.
MassIndexer (cf. Section 13.4.3.2, « Utilisation d'un MassIndexer ») optimise les index par défaut au début et à la fin du processus. Utilisez MassIndexer.optimizeAfterPurge et MassIndexer.optimizeOnFinish pour changer ce comportement par défaut.
13.5.1. Optimisation automatique Copier lienLien copié sur presse-papiers!
- un certain nombre d'opérations (insertions et suppressions), ou
- un certain nombre de transactions.
Exemple 13.62. Définition des paramètres d'optimisation automatique
hibernate.search.default.optimizer.operation_limit.max = 1000 hibernate.search.default.optimizer.transaction_limit.max = 100 hibernate.search.Animal.optimizer.transaction_limit.max = 50
hibernate.search.default.optimizer.operation_limit.max = 1000
hibernate.search.default.optimizer.transaction_limit.max = 100
hibernate.search.Animal.optimizer.transaction_limit.max = 50
Animal dès que :
- le nombre d'additions et suppressions atteint les
1000. - le nombre de transactions atteint les
50(hibernate.search.Animal.optimizer.transaction_limit.maxa la priorité surhibernate.search.default.optimizer.transaction_limit.max)
org.hibernate.search.store.optimization.OptimizerStrategy et en déterminant la propriété optimizer.implementation avec le nom complet de votre implémentation. Cette implémentation doit mettre en place l'interface, être une classe publique et avoir un constructeur public ne prenant aucun argument.
Exemple 13.63. Chargement d'un OptimizerStrategy personnalisé
hibernate.search.default.optimizer.implementation = com.acme.worlddomination.SmartOptimizer hibernate.search.default.optimizer.SomeOption = CustomConfigurationValue hibernate.search.humans.optimizer.implementation = default
hibernate.search.default.optimizer.implementation = com.acme.worlddomination.SmartOptimizer
hibernate.search.default.optimizer.SomeOption = CustomConfigurationValue
hibernate.search.humans.optimizer.implementation = default
default peut être utilisé pour sélectionner l'implémentation d'Hibernate Search par défaut ; toutes les propriétés après le séparateur de clé .optimizer seront transférées vers la méthode initialize de la mise en œuvre au démarrage.
13.5.2. Optimisation manuelle Copier lienLien copié sur presse-papiers!
SearchFactory :
Exemple 13.64. Optimisation de l'index par programmation
Orders et le second optimise tous les index.
Note
searchFactory.optimize() n'a aucun effet sur un backend JMS. Vous devez appliquer l'opération d'optimisation sur le nœud du Master.
13.5.3. Ajustement d'optimisation Copier lienLien copié sur presse-papiers!
hibernate.search.[default|<indexname>].indexwriter.max_buffered_docshibernate.search.[default|<indexname>].indexwriter.max_merge_docshibernate.search.[default|<indexname>].indexwriter.merge_factorhibernate.search.[default|<indexname>].indexwriter.ram_buffer_sizehibernate.search.[default|<indexname>].indexwriter.term_index_interval
13.6. Fonctionnalités avancées Copier lienLien copié sur presse-papiers!
13.6.1. Accès à la SearchFactory Copier lienLien copié sur presse-papiers!
SearchFactory suit les ressources Lucene sous-jacentes pour Hibernate Search. C'est un moyen efficace d'accéder à Lucene en mode natif. La SearchFactory peut être accédé à partir d'une FullTextSession:
Exemple 13.65. Accès à la SearchFactory
FullTextSession fullTextSession = Search.getFullTextSession(regularSession); SearchFactory searchFactory = fullTextSession.getSearchFactory();
FullTextSession fullTextSession = Search.getFullTextSession(regularSession);
SearchFactory searchFactory = fullTextSession.getSearchFactory();
13.6.2. Utilisation d'un IndexReader Copier lienLien copié sur presse-papiers!
IndexReader. Hibernate Search peut effectuer une mise en cache des lecteurs d'index pour maximiser la performance, ou pour fournir d'autres stratégies efficaces pour récupérer un IndexReader mis à jour en minimisant les opérations E/S. Votre code peut accéder ces ressources mises en cache, mais il existe plusieurs pré-requis.
Exemple 13.66. Accès à un IndexReader
SearchFactory détermine les index requis pour effectuer une demande de cette entité (stratégie de partitionnement). L'utilisation de la ReaderProvider configurée sur chaque index renvoie un composant IndexReader au-dessus de tous les index impliqués. Cette IndexReader étant partitionné pour plusieurs clients, vous devez adhérer aux règles suivantes :
- Ne jamais appeler indexReader.close(), mais utiliser plutôt readerProvider.closeReader(reader) si nécessaire, de préférence dans un bloc finally.
- Ne pas utiliser
IndexReaderpour des modifications (il s'agit d'uneIndexReader: toute modification entraînera une exception).
IndexReader librement, particulièrement pour effectuer des requêtes Lucene natives. L'utilisation des IndexReader partagés rendra la plupart des requêtes plus efficaces que si elles étaient ouvertes directement à partir du filesystem par exemple.
open(Class... types), vous pouvez utiliser open(String... indexNames), une méthode vous permettant de passer dans un ou plusieurs noms d'index. Cette stratégie vous permet également de sélectionner un sous-ensemble d'index pour chaque type indexé si le partitionnement est utilisé.
Exemple 13.67. Accéder à une IndexReader by index names
IndexReader reader = searchFactory.getIndexReaderAccessor().open("Products.1", "Products.3");
IndexReader reader = searchFactory.getIndexReaderAccessor().open("Products.1", "Products.3");
13.6.3. Accès à un répertoire Lucene Copier lienLien copié sur presse-papiers!
Répertoire est l'abstraction la plus courante utilisée par Lucene pour représenter le stockage de l'index ; Hibernate Search n'intéragit pas directement avec un Répertoire Lucene mais extrait ces interactions par le biais d'un IndexManager : un index ne doit pas forcément être mis en œuvre par un Répertoire.
Répertoire et que vous souhaitez y accéder, vous pouvez obtenir une référence au Répertoire par le biais de l'IndexManager. Envoyez l'IndexManager vers un DirectoryBasedIndexManager puis utilisez getDirectoryProvider().getDirectory() pour obtenir une référence au Répertoire sous-jacent. Cette action n'étant pas recommandée, nous conseillons d'utiliser IndexReader à la place.
13.6.4. Partitionnement d'indexes Copier lienLien copié sur presse-papiers!
Avertissement
- Un index unique est trop volumineux, donc les temps de mises à jour ralentissent l'application.
- Une recherche typique ne touchera qu'un sous-ensemble d'indexes, comme quand les données sont segmentées naturellement par client, région ou application.
hibernate.search.<indexName>.sharding_strategy.nbr_of_shards.
Exemple 13.68. Activer le partitionnement de l'index
hibernate.search.<indexName>.sharding_strategy.nbr_of_shards = 5
hibernate.search.<indexName>.sharding_strategy.nbr_of_shards = 5
IndexShardingStrategy est chargée de diviser les données en sous-indexes. La stratégie de partitionnement par défaut divise les données en fonction de la valeur de hachage de la représentation de la chaîne d'ID (générée par le FieldBridge). Cela garantit un partitionnement assez équilibré. Vous pouvez remplacer la stratégie par défaut avec une IndexShardingStrategy personnalisée. Pour utiliser votre statégie personnalisée, vous devez définir la propriété hibernate.search.<indexName>.sharding_strategy.
Exemple 13.69. Spécifier une stratégie de partitionnement personnalisée
hibernate.search.<indexName>.sharding_strategy = my.shardingstrategy.Implementation
hibernate.search.<indexName>.sharding_strategy = my.shardingstrategy.Implementation
IndexShardingStrategy permet également d'optimiser les recherches en sélectionnant dans quelle partition (shard) exécuter la requête. En activant un filtre, une stratégie de partitionnement peut sélectionner un sous-ensemble de sections permettant de répondre à une requête (IndexShardingStrategy.getIndexManagersForQuery) et ainsi accélérer l'exécution de la requête.
IndexManager indépendant, et donc peut être configuré pour utiliser un fournisseur et un serveur de sauvegarde différents. Les noms d'indexes IndexManager pour l'entité Animal dans Exemple 13.70, « Configuration de partitionnement pour l'entité Animal » sont Animal.0 à Animal.4. En d'autres termes, chaque partition porte le nom de l'index auquel il appartient, suivi de . (point) et son numéro d'index.
Exemple 13.70. Configuration de partitionnement pour l'entité Animal
Animal en 5 sous indexes. Tous les sous-indexes sont des instances du système de fichiers et du répertoire où est stocké chaque sous-index comme suit :
- pour le sous-index 0 :
/usr/lucene/indexes/Animal00(indexBase partagée mais indexName substitué) - pour le sous-index 1 :
/usr/lucene/indexes/Animal.1(indexBase partagé, indexName par défaut) - pour le sous-index 2 :
/usr/lucene/indexes/Animal.1(indexBase partagé, indexName par défaut) - pour le sous-index 3 :
/usr/lucene/indexes/Animal03(indexBase substitué, indexName substitué) - pour le sous-index 4 :
/usr/lucene/indexes/Animal.4(indexBase partagé, indexName par défaut)
IndexShardingStrategy, n'importe quel champ peut être utilisé pour déterminer la sélection de partitionnement. Considérons que pour traiter des suppressions, avec les opérations purge et purgeAll, l'implémentation soit amenée à retourner un ou plusieurs indexes sans être en mesure de lire toutes les valeurs de champ ou l'identificateur principal. Dans ce cas, l'information ne suffit pas pour choisir un seul indice, tous les indexes doivent être retournés, afin que l'opération de suppression puisse être propagée à tout index susceptible de contenir les documents devant être supprimés.
13.6.5. Personnalisation de la formule de notation de Lucene Copier lienLien copié sur presse-papiers!
org.apache.lucene.search.Similarity. Les méthodes d'abstraction définies dans cette classe correspondent aux facteurs de la formule suivante en calculant la note de la requête q d'un document d :
| Facteur | Description |
|---|---|
| tf(t ind) | Facteur de fréquence de terme pour le terme (t) du document (d). |
| idf(t) | Inverse la fréquence du document du terme. |
| coord(q,d) | Facteur de score basé sur le nombre de termes de requêtes trouvés dans un document spécifique. |
| queryNorm(q) | Facteur de normalisation utilisé pour noter des requêtes comparables. |
| t.getBoost() | Boost de champ. |
| norm(t,d) | Contient quelques boosts (de temps d'indexation) et facteurs de longueur. |
Similarity pour plus d'informations.
Similarity en utilisant la propriété hibernate.search.similarity. La valeur par défaut est org.apache.lucene.search.DefaultSimilarity.
similarity.
hibernate.search.default.similarity = my.custom.Similarity
hibernate.search.default.similarity = my.custom.Similarity
@Similarity.
tf(float freq) devrait être 1.0.
Avertissement
Similarity. Les classes dans la même hiérarchie de classe partagent toujours le même index, il n'est donc pas autorisé de remplacer l'implémentation de Similarity dans un sous-type.
13.6.6. Configuration pour la gestion des exceptions Copier lienLien copié sur presse-papiers!
hibernate.search.error_handler = log
hibernate.search.error_handler = log
ErrorHandler, qui fournit la méthode handle(ErrorContext context). ErrorContext fournit une référence à l'instance principale de LuceneWork, à l'exception sous-jacente et à toute instance LuceneWork suivante qui n'aurait pas pu été traitée à cause de l'exception principale.
ErrorHandler dans les propriétés de configuration :
hibernate.search.error_handler = CustomerErrorHandler
hibernate.search.error_handler = CustomerErrorHandler
13.6.7. Désactiver Hibernate Search Copier lienLien copié sur presse-papiers!
Pour désactiver Hibernate Search, définir l'option de configuration indexing_strategy à manual, puis redémarrez JBoss EAP.
hibernate.search.indexing_strategy = manual
hibernate.search.indexing_strategy = manual
Pour désactiver Hibernate Search totalement, désactiver tous les listeners en modifiant l'option de configuration autoregister_listeners à false, puis redémarrez JBoss EAP.
hibernate.search.autoregister_listeners = false
hibernate.search.autoregister_listeners = false
Chapitre 14. Services Web JAX-RS Copier lienLien copié sur presse-papiers!
14.1. JAX-RS Copier lienLien copié sur presse-papiers!
helloworld-rs, jax-rs-client, et kitchensink quickstart: Section 1.4.1.1, « Accès aux Quickstarts ».
14.2. RESTEasy Copier lienLien copié sur presse-papiers!
14.3. Services web RESTful Copier lienLien copié sur presse-papiers!
14.4. Annotations définies RESTEasy Copier lienLien copié sur presse-papiers!
| Annotation | Utilisation |
|---|---|
ClientResponseType | Il s'agit d'une annotation que vous pouvez ajouter à une interface de client RESTEasy qui a un type de renvoi Réponse. |
ContentEncoding | Méta annotation qui indique un Contenet-Encoding à appliquer par l'annotation annotée. |
DecorateTypes | Doit être mis sur une classe DecoratorProcessor pour spécifier les types pris en charge. |
Decorator | Méta annotation à mettre dans une autre annotation qui déclenche décoration. |
Form | Peut être utilisé comme objet de valeur pour les requêtes/réponses entrantes/sortantes. |
StringParameterUnmarshallerBinder | Méta annotation à mettre dans une autre annotation qui déclenche un StringParameterUnmarshaller à appliquer à un injecteur d'annotation basé chaîne. |
Cache | Définit l'en-tête Cache-Control de réponse automatiquement. |
NoCache | Définit la réponse Cache-Control à "nocache". |
ServerCached | Indique que la réponse à cette méthode jax-rs devrait être mise en cache sur le serveur. |
ClientInterceptor | Identifie un intercepteur en tant qu'intercepteur côté client. |
DecoderPrecedence | Cet intercepteur est un décodeur Content_Encoding. |
EncoderPrecedence | Cet intercepteur est un encodeur Content_Encoding. |
HeaderDecoratorPrecedence | Les intercepteurs HeaderDecoratorPrecedence doivent toujours venir en premier car ils décorent une réponse (sur le serveur), ou une réquête sortante (sur le client) avec des en-têtes spéciaux définis utilisateur. |
RedirectPrecedence | Doivent être mis dans un PreProcessInterceptor. |
SecurityPrecedence | Doivent être mis dans un PreProcessInterceptor. |
ServerInterceptor | Identifie un intercepteur en tant qu'intercepteur côté client. |
NoJackson | Mis sur une classe, un paramètre, un champ ou une métode quand vous ne souhaitez pas déclencher un fournisseur Jackson. |
ImageWriterParams | Annotation qu'une classe de ressource peut utiliser pour passer des paramètres au IIOImageProvider. |
DoNotUseJAXBProvider | Mettre ceci sur une classe ou sur un paramètre quand vous ne souhaitez pas utiliser le MessageBodyReader/Writer JAXB, mais que vous avez à la place un fournisseur plus spécifique que vous souhaitez utliser pour marshaler le type. |
Formatted | Formate la sortie XML par des indentations et des nouvelles lignes. Il s'agit d'un Decorateur JAXB. |
IgnoreMediaTypes | Mis sur un type, une méthode, un paramètre ou un champ pour indiquer au JAXRS de ne pas utiliser de fournisseur JAXB pour une certain type de media. |
Stylesheet | Indique un en-tête de feuille de style XML. |
Wrapped | Mettre ceci sur une méthode ou un paramètre quand vous souhaitez marshaller ou démarshaller une collection ou un tableau d'objets JAXB. |
WrappedMap | Mettre ceci sur une méthode ou un paramètre quand vous souhaitez marshaller ou démarshaller une mappe d'objets JAXB. |
XmlHeader | Définit un en-tête XML de document renvoyé. |
BadgerFish | Un JSONConfig. |
Mapped | Un JSONConfig. |
XmlNsMap | Un JSONToXml. |
MultipartForm | Peut être utilisé comme objet de valeur pour les requêtes/réponses entrantes/sortantes d'un type de mime multipart/form-data. |
PartType | Doit être utilisé en conjonction avec des fournisseurs Multipart quand on écrit une liste ou un mappage de type multipart/*. |
XopWithMultipartRelated | Cette annotation peut être utilisée pour traiter/produire des messages XOP entrants/sortants (packagés comme multipart/related) vers/en provenance d'objets annotés JAXB. |
After | Utilisée pour ajouter un attribut d'expiration quand on signe ou comme contrôle. |
Signed | Annotation pratique qui déclenche la signature d'une requête ou d'une réponse utilisant la spécification DOSETA. |
Verify | Vérification d'une signature entrante spécifiée dans un en-tête de signature. |
14.5. Configuration RESTEasy Copier lienLien copié sur presse-papiers!
14.5.1. Paramètres de configuration RESTEasy Copier lienLien copié sur presse-papiers!
| Nom d'option | Valeur par défaut | Description |
|---|---|---|
| resteasy.servlet.mapping.prefix | Pas de valeur par défaut | Si le modèle d'url du mappage de servlet Resteasy n'est pas /*. |
| resteasy.scan | false | Scanner automatiquement les jars WEB-INF/lib et le répertoire WEB-INF/classes pour @Provider et les classes de ressource JAX-RS (@Path, @GET, @POST etc..) à la fois et les enregistrer. |
| resteasy.scan.providers | false | Scanner les classes @Provider et les enregistrer. |
| resteasy.scan.resources | false | Scanner les classes de ressources JAX-RS. |
| resteasy.providers | pas de valeur par défaut | Une liste de noms de classes @Provider complètes que vous souhaitez enregistrer délimitée par des virgules. |
| resteasy.use.builtin.providers | true | Indique si on doit ou non enregistrer les classes @Provider intégrées, par défaut. |
| resteasy.resources | Pas de valeur par défaut | Une liste de noms de classes de ressources JAX-RS complètes que vous souhaitez enregistrer délimitée par des virgules. |
| resteasy.jndi.resources | Pas de valeur par défaut | Une liste délimitée par des virgules de noms JNDI qui référencent des objets que vous souhaitez enregistrer comme ressources JAX-RS. |
| javax.ws.rs.Application | Pas de valeur par défaut | Nom qualifié de classe d'application à amorcer en spec portable. |
| resteasy.media.type.mappings | Pas de valeur par défaut | Remplace le besoin d'un en-tête Accept par mappage des extensions de noms de fichier (comme .xml ou .txt) avec un type de media. Utilisé quand le client n'est pas en mesure d'utiliser un en-tête Accept pour choisir une représentation (par ex. un navigateur). |
| resteasy.language.mappings | Pas de valeur par défaut | Remplace le besoin d'un en-tête Accept-Language par mappage des extensions de noms de fichier (comme .en ou .fr) avec une langue. Utilisé quand le client n'est pas en mesure d'utiliser un en-tête Accept-Language pour choisir une représentation (par ex. un navigateur). |
| resteasy.document.expand.entity.references | false | Indique si on doit étendre les entitiés externes ou si on doit les remplacer par une chaine vide. Dans JBoss EAP 6, ce paramètre a comme valeur par défaut false, donc elles sont remplacées par une chaîne vide. |
| resteasy.document.secure.processing.feature | true | Impose des contraintes de sécurité pour le traitement des documents org.w3c.dom.Document et des représentations d'objets JAXB. |
| resteasy.document.secure.disableDTDs | true | Interdit les DTD dans les documents org.w3c.dom.Document et les représentations d'objets JAXB. |
Important
resteasy.scan.* du fichier web.xml seront ignorées, et tous les composants annotés JAX-RS seront scannés automatiquement.
14.6. JAX-RS Web Service Security Copier lienLien copié sur presse-papiers!
14.6.1. Activez la sécurité basée-rôle pour RESTEasy JAX-RS Web Service Copier lienLien copié sur presse-papiers!
RESTEasy supporte les annotations @RolesAllowed, @PermitAll, et @DenyAll sur les méthodes JAX-RS. Cependant, il ne reconnaît pas ces annotations par défaut. Suivre les étapes suivantes pour configurer le fichier web.xml et pour activer la sécurité basée-rôle.
Avertissement
Procédure 14.1. Activez la sécurité basée-rôle pour RESTEasy JAX-RS Web Service
- Ouvrir le fichier
web.xmlde l'application dans un éditeur de texte. - Ajoutez le <context-param> suivant au fichier, dans les balises
web-app:<context-param> <param-name>resteasy.role.based.security</param-name> <param-value>true</param-value> </context-param><context-param> <param-name>resteasy.role.based.security</param-name> <param-value>true</param-value> </context-param>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Déclarez tous les rôles utilisés dans le fichier RESTEasy JAX-RS WAR file, en utilisant les balises de <security-role> :
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Autorisez l'accès à tous les URL gérés par le runtime JAX-RS pour tous les rôles :
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
La sécurité basée rôle à été activée dans l'application, avec un certain nombre de rôles définis.
Exemple 14.1. Exemple de configuration de sécurité basée rôles
14.6.2. Sécuriser un service JAX-RS Web par des annotations Copier lienLien copié sur presse-papiers!
Cette rubrique couvre les étapes à parcourir pour sécuriser un service JAX-RS Web par les annotations de sécurité supportées.
Procédure 14.2. Sécuriser un service JAX-RS Web par des annotations de sécurité supportées.
- Activez la sécurité basée-rôle. Pour plus d'informations, voir Section 14.6.1, « Activez la sécurité basée-rôle pour RESTEasy JAX-RS Web Service ».
- Ajoutez des annotations de sécurité au service JAX-RS Web. RESTEasy supporte les annotations suivantes :
- @RolesAllowed
- Définit les rôles qui peuvent accéder à la méthode. Tous les rôles doivent être définis dans le fichier
web.xml. - @PermitAll
- Autorise tous les rôles définis dans le fichier
web.xmlà accéder à la méthode. - @DenyAll
- Refuse tout accès à la méthode.
14.7. Gestion des exceptions Copier lienLien copié sur presse-papiers!
14.7.1. Créer un mappeur d'exceptions Copier lienLien copié sur presse-papiers!
Les mappeurs d'exceptions sont des composants fournis par des applications, personnalisés qui interceptent les exceptions lancées et qui écrivent des réponses HTTP spécifiques.
Exemple 14.2. Mappeur d'exceptions
ExceptionMapper .
web.xml sous le paramètre de contexte resteasy.providers, ou bien renvoyez-le par programmation via la classe ResteasyProviderFactory.
14.7.2. Exceptions RESTEasy lancées en interne Copier lienLien copié sur presse-papiers!
| Exception | Code HTTP | Description |
|---|---|---|
| BadRequestException | 400 | Échec de la requête. La requête n'a pas été formatée correctement, ou il y a eu un problème lors de son traitement. |
| UnauthorizedException | 401 | Non autorisé. Exception de sécurité envoyée si vous utilisez la sécurité basée rôle annotée RESTEasy. |
| InternalServerErrorException | 500 | Erreur interne de serveur. |
| MethodNotAllowedException | 405 | Il n'y a pas de méthode JAX-RS pour la ressource qui peut gérer l'opération HTTP invoquée. |
| NotAcceptableException | 406 | Il n'y a pas de méthode JAX-RS qui puisse produire les types de media listés dans l'en-tête Accept |
| NotFoundException | 404 | Il n'y a pas de méthode JAX-RS qui serve le chemin/la ressource de la requête. |
| ReaderException | 400 | Toutes les exceptions envoyées, à partir des MessageBodyWriters sont incluses dans cette exception. S'il n'y a pas de ExceptionMapper dans l'exception, ou si l'exception n'est pas une WebApplicationException , alors RESTEasy renverra un code 400 par défaut. |
| WriterException | 500 | Toutes les exceptions envoyées, à partir des MessageBodyWriters sont incluses dans cette exception. S'il n'y a pas de ExceptionMapper dans l'exception, ou si l'exception n'est pas une WebApplicationException , alors RESTEasy renverra un code 400 par défaut. |
| JAXBUnmarshalException | 400 | Les fournisseurs JAXB (XML et Jettison) envoient cette exception sur les lectures. Peuvent correspondre à des wrapping JAXBExceptions. Cette classe s'étend à ReaderException. |
| JAXBMarshalException | 500 | Les fournisseurs JAXB (XML et Jettison) envoient cette exception sur les lectures. Peuvent correspondre à des wrapping JAXBExceptions. Cette classe s'étend à WriterException. |
| ApplicationException | S/O | Encapsule toutes les exceptions levées à partir du code d'application. Fonctionne de la même façon que InvocationTargetException. S'il y a un ExceptionMapper pour l'exception encapsulée, elle sera utilisée pour traiter la demande |
| Échec | S/O | Erreur RESTEasy interne. Non journalisée. |
| LoggableFailure | S/O | Erreur RESTEasy interne. Journalisée. |
| DefaultOptionsMethodException | S/O | Si l'utilisateur invoque HTTP OPTIONS et qu'il n'y a pas de méthode JAX-RS, RESTEasy fournira un comportement par défaut en lançant cette exception. |
14.8. Intercepteurs RESTEasy Copier lienLien copié sur presse-papiers!
14.8.1. Interception des invocations JAX-RS Copier lienLien copié sur presse-papiers!
RESTEasy peut intercepter les invocations JAX-RS et les re-router vers des objets style listener que l'on appelle des intercepteurs. Cette section couvre les descriptions de quatre types d'intercepteurs.
Exemple 14.3. Intercepteurs MessageBodyReader/Writer
@Provider, ainsi que par @ServerInterceptor ou @ClientInterceptor, de façon à ce que RESTEasy sache s'il doit les ajouter ou non à la liste d'intercepteurs.
MessageBodyReader.readFrom() ou de MessageBodyWriter.writeTo(). Ils peuvent être utilisés pour encapsuler les flux d'entrée ou de sortie.
MessageBodyReaderContext.proceed() ou MessageBodyWriterContext.proceed() est appelé pour aller vers le prochain intercepteur, ou, s'il n'y a plus d'intercepteur à invoquer, la méthode readFrom() ou writeTo() du MessageBodyReader ou du MessageBodyWriter. Cette encapsulation permet aux objets d'être modifiés avant d'aller vers le Reader ou Writer, puis d'être nettoyés, après proceed().
Exemple 14.4. PreProcessInterceptor
public interface PreProcessInterceptor
{
ServerResponse preProcess(HttpRequest request, ResourceMethod method) throws Failure, WebApplicationException;
}
public interface PreProcessInterceptor
{
ServerResponse preProcess(HttpRequest request, ResourceMethod method) throws Failure, WebApplicationException;
}
preProcess() renvoie une ServerResponse, alors la méthode JAX-RS sous-jacente ne sera pas invoquée, et le runtime traitera la réponse et retournera au client. Si la méthode preProcess() ne renvoie pas une ServerResponse, la méthode JAX-RS sous-jacente sera alors invoquée.
Exemple 14.5. PostProcessInterceptors
public interface PostProcessInterceptor
{
void postProcess(ServerResponse response);
}
public interface PostProcessInterceptor
{
void postProcess(ServerResponse response);
}
Exemple 14.6. ClientExecutionInterceptors
@ClientInterceptor et @Provider. Ces intercepteurs sont exécutés après que le MessageBodyWriter, et que le ClientRequest aient été créés côté client.
14.8.2. Lier un intercepteur à une méthode JAX-RS Copier lienLien copié sur presse-papiers!
Par défaut, tous les intercepteurs sont invoqués pour chaque requête. L'interface AcceptedByMethod peut être implémentée pour préciser ce comportement.
Exemple 14.7. Exemple de liaison d'intercepteurs
accept() pour les intercepteurs qui implémentent l'interface AcceptedByMethod. Si la méthode renvoie true, l'intercepteur sera ajouté à la chaîne d'appel de la méthode JAX-RS; sinon, il sera ignoré avec cette méthode.
accept() détermine si l'annotation @GET est présente dans la méthode JAX-RS. Si tel est le cas, l'intercepteur sera appliqué à la chaîne d'appel de la méthode.
14.8.3. Enregistrer un intercepteur Copier lienLien copié sur presse-papiers!
Cette section couvre la façon dont on doit enregistrer un intercepteur RESTEasy JAX-RS dans une application.
Procédure 14.3. Enregistrer un intercepteur
- Pour enregistrer un intercepteur, listez-le dans le fichier
web.xmlsous le paramètre de contexteresteasy.providers, ou bien renvoyez-le sous forme de classe ou d'objet dansApplication.getClasses()ouApplication.getSingletons()
14.8.4. Familles de précédence d'intercepteur Copier lienLien copié sur presse-papiers!
14.8.4.1. Familles de précédence d'intercepteur Copier lienLien copié sur presse-papiers!
Les intercepteurs peuvent être sensibles à l'ordre dans lequel ils sont invoqués. Mettre les intercepteurs de groupes RESTEasy en familles pour faciliter l'ordonnancement. Cette section couvre les familles de précédence d'intercepteurs intégrés et les intercepteurs associés à chaque famille.
- SECURITY
- Les intercepteurs SECURITY sont normalement des PreProcessInterceptors. Ils sont invoqués en premier car on ne doit pas faire grand chose avant que l'invocation soit autorisée.
- HEADER_DECORATOR
- Les intercepteurs HEADER_DECORATOR ajoutent des en-têtes à une réponse ou à une requête sortante. Ils suivent les intercepteurs de sécurité car les en-têtes ajoutés peuvent affecter le comportement des autres familles d'intercepteurs.
- ENCODER
- Les intercepteurs ENCODER changent l'OutputStream. Par exemple, l'intercepteur GZIP crée un GZIPOutputStream pour envelopper l'outputStream réel pour la compression.
- REDIRECT
- Les intercepteurs REDIRECT sont normalement utilisés dans PreProcessInterceptors, car ils peuvent router à nouveau la demande et éviter ainsi totalement la méthode JAX-RS.
- DECODER
- Les intercepteurs DECODER englobent l'IutputStream. Par exemple, le décodeur d'intercepteur GZIP englobe le GZIPInputStream.
org.jboss.resteasy.annotations.interception du package : @DecoredPrecedence, @EncoderPrecedence, @HeaderDecoratorPrecedence, @RedirectPrecedence, @SecurityPrecedence pour la sécurité. Utilisez les à la place de l'annotation @Precedence.Pour plus d'informations, consultezSection 14.4, « Annotations définies RESTEasy ».
14.8.4.2. Définissez une famille de précédence d'intercepteurs personnalisée Copier lienLien copié sur presse-papiers!
Les familles de précédence personnalisées peuvent être créées ou enregistrées dans le fichier web.xml. Ce sujet couvre des exemples des paramètres de contexte disponibles pour définir les familles de précédence d'intercepteurs.
Exemple 14.8. resteasy.append.interceptor.precedence
resteasy.append.interceptor.precedence rajoute la nouvelle famille de précédence à la liste de famille de précédent par défaut.
<context-param>
<param-name>resteasy.append.interceptor.precedence</param-name>
<param-value>CUSTOM_PRECEDENCE_FAMILY</param-value>
</context-param>
<context-param>
<param-name>resteasy.append.interceptor.precedence</param-name>
<param-value>CUSTOM_PRECEDENCE_FAMILY</param-value>
</context-param>
Exemple 14.9. resteasy.interceptor.before.precedence
resteasy.interceptor.before.precedence définit la famille de précédence par défaut exécutée avant la famille personnalisée. La valeur du paramètre est sous la forme DEFAULT_PRECEDENCE_FAMILY/CUSTOM_PRECEDENCE_FAMILY, délimitée par un ':'.
<context-param>
<param-name>resteasy.interceptor.before.precedence</param-name>
<param-value>DEFAULT_PRECEDENCE_FAMILY : CUSTOM_PRECEDENCE_FAMILY</param-value>
</context-param>
<context-param>
<param-name>resteasy.interceptor.before.precedence</param-name>
<param-value>DEFAULT_PRECEDENCE_FAMILY : CUSTOM_PRECEDENCE_FAMILY</param-value>
</context-param>
Exemple 14.10. resteasy.interceptor.after.precedence
resteasy.interceptor.after.precedence définit la famille de précédence par défaut exécutée après la famille personnalisée. La valeur du paramètre est sous la forme DEFAULT_PRECEDENCE_FAMILY/CUSTOM_PRECEDENCE_FAMILY, délimitée par un :.
<context-param>
<param-name>resteasy.interceptor.after.precedence</param-name>
<param-value>DEFAULT_PRECEDENCE_FAMILY : CUSTOM_PRECEDENCE_FAMILY</param-value>
</context-param>
<context-param>
<param-name>resteasy.interceptor.after.precedence</param-name>
<param-value>DEFAULT_PRECEDENCE_FAMILY : CUSTOM_PRECEDENCE_FAMILY</param-value>
</context-param>
14.9. Annotations basées chaîne Copier lienLien copié sur presse-papiers!
14.9.1. Conversion des annotations basées @*Param en objects Copier lienLien copié sur presse-papiers!
@*Param JAX-RS, dont @QueryParam, @MatrixParam, @HeaderParam, @PathParam et @FormParam, sont représentées par des chaînes dans une requête HTTP brut. Ces types de paramètres injectés peuvent être convertis en objets si ces objets ont une méthode valueOf(String) statique ou un constructeur qui prend un paramètre String.
@Provider commerciales pour effectuer cette conversion pour les classes qui n'ont ni de méthode valueOf(String) statique, ni de constructeur de string.
Exemple 14.11. StringConverter
Exemple 14.12. StringParameterUnmarshaller
StringParameterUnmarshaller est sensible aux annotations placées sur le paramètre ou le champ sur lesquels vous injectez. Il est créé par injecteur. La méthode setAnnotations() est appelée par resteasy pour initialiser l'unmarshaller.
org.jboss.resteasy.annotations.StringsParameterUnmarshallerBinder.
java.util.Date basé @PathParam.
14.10. Configuration des extensions de fichiers Copier lienLien copié sur presse-papiers!
14.10.1. Mapper les extensions de fichiers avec les types de media dans le fichier web.xml Copier lienLien copié sur presse-papiers!
Certains clients, comme les navigateurs, ne peuvent pas utiliser les en-têtes Accept et Accept-Language pour négocier le type de média de la représentation ou la langue. RESTEasy peut mapper des suffixes de noms de fichier aux langues et types de médias pour régler ce problème. Procédez comme suit pour mapper les types de media avec les extensions de fichier, dans le fichier web.xml
Procédure 14.4. Mapper des types de media avec les extensions de fichiers
- Ouvrir le fichier
web.xmlde l'application dans un éditeur de texte. - Ajouter le paramètre de contexte
resteasy.media.type.mappingsau fichier, dans les balisesweb-app:<context-param> <param-name>resteasy.media.type.mappings</param-name> </context-param><context-param> <param-name>resteasy.media.type.mappings</param-name> </context-param>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Configurer les valeurs des paramètres. Les mappages forment une liste délimitée par des virgules. Chaque mappage est délimité par un
::Exemple 14.13. Exemple de mappage
<context-param> <param-name>resteasy.media.type.mappings</param-name> <param-value>html : text/html, json : application/json, xml : application/xml</param-value> </context-param><context-param> <param-name>resteasy.media.type.mappings</param-name> <param-value>html : text/html, json : application/json, xml : application/xml</param-value> </context-param>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
14.10.2. Mapper les extensions de fichiers vers les langues dans le fichier web.xml Copier lienLien copié sur presse-papiers!
Certains clients, comme les navigateurs, ne peuvent pas utiliser les en-têtes Accept et Accept-Language pour négocier le type de média de la représentation ou la langue. RESTEasy peut mapper des suffixes de noms de fichiers aux langues et aux types de médias pour régler ce problème. Procédez comme suit pour mapper les langues avec les extensions de fichier, dans le fichier web.xml
Procédure 14.5. Mapper les extensions de fichiers vers les langues dans le fichier web.xml
- Ouvrir le fichier
web.xmlde l'application dans un éditeur de texte. - Ajouter le paramètre de contexte
resteasy.language.mappingsau fichier, dans les balisesweb-app:<context-param> <param-name>resteasy.language.mappings</param-name> </context-param><context-param> <param-name>resteasy.language.mappings</param-name> </context-param>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Configurer les valeurs des paramètres. Les mappages forment une liste délimitée par des virgules. Chaque mappage est délimité par un
::Exemple 14.14. Exemple de mappage
<context-param> <param-name>resteasy.language.mappings</param-name> <param-value> en : en-US, es : es, fr : fr</param-name> </context-param><context-param> <param-name>resteasy.language.mappings</param-name> <param-value> en : en-US, es : es, fr : fr</param-name> </context-param>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
14.10.3. Types de media supportés par RESTEasy Copier lienLien copié sur presse-papiers!
| Type de media | Type Java |
|---|---|
| application/*+xml, text/*+xml, application/*+json, application/*+fastinfoset, application/atom+* | Classes annotées JaxB |
| application/*+xml, text/*+xml | org.w3c.dom.Document |
| */* | java.lang.String |
| */* | java.io.InputStream |
| text/brut | primitives, java.lang.String, ou tout type qui possède un contructeur de String, ou une méthode valueOf(String) pour les entrées et, toString() pour les sorties |
| */* | javax.activation.DataSource |
| */* | byte[] |
| */* | java.io.File |
| application/x-www-form-urlencoded | javax.ws.rs.core.MultivaluedMap |
14.11. API JavaScript RESTEasy Copier lienLien copié sur presse-papiers!
14.11.1. API JavaScript RESTEasy Copier lienLien copié sur presse-papiers!
Exemple 14.15. Simple exemple d'API JavaScript JAX-RS
var text = Foo.get({order: 'desc', 'X-Foo': 'hello',
colour: 'blue', 'Foo-Cookie': 123987235444});
Foo.put({$entity: text});
var text = Foo.get({order: 'desc', 'X-Foo': 'hello',
colour: 'blue', 'Foo-Cookie': 123987235444});
Foo.put({$entity: text});
14.11.2. Activation du Servlet API JavaScript RESTEasy Copier lienLien copié sur presse-papiers!
L'API JavaScript RESTEasy n'est pas activé par défaut. Suivre les étapes suivantes en utilisant le fichier web.xml.
Procédure 14.6. Modifier web.xml pour activer l'API RESTEasy JavaScript
- Ouvrir le fichier
web.xmlde l'application dans l'éditeur de textes. - Ajouter la configuration suivante dans le fichier, dans les balises
web-app:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
14.11.3. Paramètres de l'API JavaScript RESTEasy Copier lienLien copié sur presse-papiers!
| Property | Valeur par défaut | Description |
|---|---|---|
| $entity | L'entité pour envoyer une requête PUT ou POST. | |
| $contentType | Type MIME de l'entité de contenu envoyée comme en-tête de type de contenu ou Content-Type. Déterminé par l'annotation @Consumes. | |
| $accepts | */* | Types MIME de l'entité envoyés comme en-tête de Accept. Déterminé par l'annotation @Provides. |
| $callback | Définir à une fonction (httpCode, xmlHttpRequest, value) pour un appel asynchrone. Si non présent, l'appel sera synchronisé et renverra une valeur. | |
| $apiURL | Définit la base de l'URI du point de terminaison JAX-RS, sans la dernière barre oblique. | |
| $username | Si le nom d'utilisateur ou le mot de passe sont définis, ils seront utilisés comme informations d'authentification pour la demande. | |
| $password | Si le nom d'utilisateur ou le mot de passe sont définis, ils seront utilisés comme informations d'authentification pour la demande. |
14.11.4. Créer des requêtes AJAX par l'API JavaScript Copier lienLien copié sur presse-papiers!
L'API JavaScript RESTEasy peut être utilisé pour créer des requêtes manuellement. Cette section couvre des exemples de ce comportement.
Exemple 14.16. L'Objet REST
- apiURL
- Défini par défaut à l'URL root JAX-RS. Utilisé par chaque fonction d'API Client JavaScript lors de la création de requêtes.
- log
- Définir à une fonction(string) pour pouvoir recevoir les logs d'API Client RESTEasy. Cela est utile si vous souhaitez déboguer votre API Client ou mettre les logs là où vous pouvez les voir.
Exemple 14.17. La classe REST.Request
14.11.5. Membres de la classe REST.Request Copier lienLien copié sur presse-papiers!
| Membre | Description |
|---|---|
| execute(callback) | Exécute la requête avec toutes les informations définies pour l'objet en cours. La valeur est transmise à la fonction de rappel de l'argument optionnel, et n'est pas renvoyée. |
| setAccepts(acceptHeader) | Définit l'en-tête de la requête Accept. Par défaut */*. |
| setCredentials(username, password) | Définit les informations d'identification de la requête. |
| setEntity(entity) | Définit les informations d'identification de l'entité. |
| setContentType(contentTypeHeader) | Définit l'en-tête de la requête Type de contenu |
| setURI(uri) | Définit l'URI de la requête. Doit correspondre à un URI absolu. |
| setMethod(method) | Définit la méthode de requête. GET par défaut. |
| setAsync(async) | Contrôle si la requête doit être asynchrone. True par défaut. |
| addCookie(name, value) | Définit le cookie donnée dans le document en cours quand on exécute la requête. Sera persistant dans le navigateur. |
| addQueryParameter(name, value) | Ajoute un paramètre d'interrogation à la partie de requête URI. |
| addMatrixParameter(name, value) | Ajoute un paramètre de matrix (paramètre de chemin d'accès) au dernier segment de l'URI de la requête. |
| addHeader(nom, valeur) | Ajoute un en-tête de requête. |
14.12. RESTEasy Asynchronous Job Service Copier lienLien copié sur presse-papiers!
14.12.1. Service Job Asynchrone RESTEasy Copier lienLien copié sur presse-papiers!
14.12.2. Activer le service de jobs asynchrones Copier lienLien copié sur presse-papiers!
Procédure 14.7. Modifier le fichier web.xml
- Activer le service de jobs asynchrones dans le fichier
web.xml:<context-param> <param-name>resteasy.async.job.service.enabled</param-name> <param-value>true</param-value> </context-param><context-param> <param-name>resteasy.async.job.service.enabled</param-name> <param-value>true</param-value> </context-param>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Le service de jobs asynchrones a été activé. Pour les options de configuration, consulter : Section 14.12.4, « Paramètres de configuration de Service Job Asynchrone ».
14.12.3. Configurer les Jobs asynchrones avec RESTEasy Copier lienLien copié sur presse-papiers!
Cette section couvre des exemples de paramètres de recherche de jobs asynchrones avec RESTEasy.
Avertissement
web.xml à la place.
Important
Exemple 14.18. Le paramètre Asynch
asynch est utilisé pour exécuter des invocations en arrière-plan. Une réponse 202 Accepted est retourné, ainsi que d'un en-tête d'emplacement avec un URL pointant vers la réponse de la méthode de base.
POST http://example.com/myservice?asynch=true
POST http://example.com/myservice?asynch=true
HTTP/1.1 202 Accepted Location: http://example.com/asynch/jobs/3332334
HTTP/1.1 202 Accepted
Location: http://example.com/asynch/jobs/3332334
/asynch/jobs/{job-id}?wait={millisconds}|nowait=true
/asynch/jobs/{job-id}?wait={millisconds}|nowait=true
- GET renvoie la méthode de ressources JAX-RS invoquée comme réponse si le job est complété. Si le job n'a pas été complété, ce GET renverra un code de réponse 202 Accepted. L'invocation de GET ne supprime pas le job; peut être appelé à plusieurs reprises.
- POST procède à une lecture de la réponse du job et supprime le job s'il est terminé.
- DELETE est appelé pour nettoyer manuellement la file d'attente du job.
Note
Quand la file d'attente du job est pleine, il expulsera le job le plus ancien de la mémoire automatiquement, sans avoir besoin d'appeler DELETE.
Exemple 14.19. Wait / Nowait
wait et nowait. Si le paramètre wait n'est pas spécifié, l'opération aura par défaut nowait=true, et n'attendra pas si le job n'est pas terminé. Le paramètre wait est défini en millisecondes.
POST http://example.com/asynch/jobs/122?wait=3000
POST http://example.com/asynch/jobs/122?wait=3000
Exemple 14.20. Le Paramètre Oneway
oneway.
POST http://example.com/myservice?oneway=true
POST http://example.com/myservice?oneway=true
14.12.4. Paramètres de configuration de Service Job Asynchrone Copier lienLien copié sur presse-papiers!
Le tableau suivant donne des informations sur la paramètres contextuels configurables du Service Job Asynchrone. Ces paramètres sont configurés dans le fichier web.xml.
| Paramètre | Description |
|---|---|
| resteasy.async.job.service.max.job.results | Nombre de résultats de jobs qui peuvent être conservés en toute harmonie à un moment donné. La valeur par défaut est 100. |
| resteasy.async.job.service.max.wait | Temps d'attente maximum quand un client interroge un job. La valeur par défaut est 300000. |
| resteasy.async.job.service.thread.pool.size | Taille de thread pool des threads d'arrière-plan qui exécutent le job. La valeur par défaut est 100. |
| resteasy.async.job.service.base.path | Définit le chemin de base des URI de job. La valeur par défaut est /asynch/jobs |
Exemple 14.21. Exemple de configuration de jobs asynchrones
14.13. RESTEasy JAXB Copier lienLien copié sur presse-papiers!
14.13.1. Créer un décorateur JAXB Copier lienLien copié sur presse-papiers!
Les fournisseurs JAXB de RESTEasy ont une manière enfichable de décorer des instances Marshaller ou Unmarshaller. Il y a une annotation qui est créée soit par un Marshaller, soit par un Unmarshaller. Cette section couvre toutes les étapes pour créer un décorateur JAXB dans RESTEasy.
Procédure 14.8. Créer un décorateur JAXB dans RESTEasy
Créer la classe de processeur
- Créer une classe qui implémente DecoratorProcessor<Target, Annotation>. La cible sera soit la classe de Marshaller ou Unmarshaller JAXB. L'annotation est créée dans la seconde étape.
- Annoter la classe par @DecorateTypes, et déclarer les types MIME que le décorateur doit décorer.
- Définir les propriétés ou les valeurs au sein de la fonction
decorate.
Exemple 14.22. Exemple de classe de processeur
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Créer une annotation
- Créer une interface personnalisée annotée par @Decorator.
- Déclarer le processeur ou la cible de l'annotation @Decorator. Le processeur est créé dans la première étape. La cible sera soit la classe Marshaller JAXB ou la classe Unmarshaller JAXB.
Exemple 14.23. Exemple d'annotation
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Ajouter l'annotation créée dans une fonction dans la seconde étape de façon à ce que l'entrée ou la sortie soit décorée quand elle sera mise en ordre.
Le décorateur JAXB a été créé et sera appliqué au sein du service web JAX-RS.
14.14. RESTEasy Atom Support Copier lienLien copié sur presse-papiers!
14.14.1. Fournissseur et API Atom Copier lienLien copié sur presse-papiers!
org.jboss.resteasy.plugins.providers.atom. RESTEasy utilise JAXB pour marshaller et démarshaller l'API. Le fournisseur est basé JAXB, et ne se limite pas à envoyer des objets Atom par XML. Tous les fournisseurs JAXB que RESTEasy contient peuvent être réutilisés par le fournisseur et l'API Atom, y compris JSON. Voir Javadocs pour obtenir plus d'informations sur l'API.
14.15. RESTEasy/Spring Integration Copier lienLien copié sur presse-papiers!
14.15.1. Intégration RESTEasy/Spring Copier lienLien copié sur presse-papiers!
Conditions préalables
- Votre application doit posséder un service JAX-WS et une configuration client.
Procédure 14.9. Activer la fonctionnalité d'intégration RESTEasy/Spring
- RESTEasy s'intègre dans Spring 3.0.x.Les utilisateurs Maven doivent utiliser l'artefact resteasy-spring. Sinon, le jar sera disponible en tant que module dans JBoss EAP 6.RESTEasy est livré avec son propre Spring ContextLoaderListener qui enregistre un BeanPostProcessor spécifique à RESTEasy qui traite les annotations JAX-RS lorsqu'un bean est créé par une BeanFactory. Cela veut dire que RESTEasy recherchera automatiquement les annotations de ressource JAX-RS et @Provider dans votre classe bean et les enregistrera en tant que ressources de JAX-RS.
Exemple 14.24. Modifier web.xml
Ajouter ce qui suit au fichier web.xml pour activer la fonctionnalité d'intégration RESTEasy/Spring :Copy to Clipboard Copied! Toggle word wrap Toggle overflow Le SpringContextLoaderListener doit être déclaré après ResteasyBootstrap car il utilise les attributs de ServletContext initialisés par celui-ci.
Chapitre 15. Services Web JAX-WS Copier lienLien copié sur presse-papiers!
15.1. Services Web JAX-WS Copier lienLien copié sur presse-papiers!
WS-Notification, WS-Addressing, WS-Policy, WS-Security et WS-Trust. Ils communiquent à l'aide d'un XML spécialisé appelé Simple Object Access Protocol (SOAP), qui définit une architecture de message et le message de formats.
WebService et WebMethod.
webservices.
Les JBoss EAP Quickstarts incluent plusieurs applications JAX-WS Web Services qui fonctionnent correctement. Exemples :
- wsat-simple
- wsba-coordinator-completion-simple
- wsba-participant-completion-simple
15.2. Configurer le sous-système des services web Copier lienLien copié sur presse-papiers!
webservices, qui contrôle le comportement des Services Web déployés dans JBoss EAP 6. La commande pour modifier chaque élément dans le script de gestion CLI (EAP_HOME /bin/jboss-cli.sh ou EAP_HOME /bin/jboss-cli.bat) est fournie. Supprimer la partie de la commande /profile=default pour les serveurs autonomes, ou remplacer default par le nom de profil à configurer.
Vous pouvez écrire à nouveau l'élément <soap:address> dans les contrats WSDL endpoint-published. Cette solution peut être utilisée pour contrôler l'adresse du serveur qui est publiée aux clients pour chaque point de terminaison. Chacun des éléments suivants en option peut être modifié pour satisfaire vos besoins. S'il y a un déploiement WS actif, alors toute modification d'un de ces éléments exigera un redémarrage du serveur.
| Élément | Description | CLI Command |
|---|---|---|
| modify-wsdl-address |
Indique s'il faut toujours modifier l'adresse WSDL. Si true, le contenu de
< adresse:soap > sera toujours remplacé. Si false, le contenu de < adresse:soap > sera remplacé seulement si ce n'est pas une URL valide. Les valeurs utilisées seront wsdl-host, wsdl-port, et wsdl-secure-port décrit ci-dessous.
| /profile=default/subsystem=webservices/:write-attribute(name=modify-wsdl-address,value=true)
|
| wsdl-host |
Le nom d'hôte / adresse IP à utiliser pour écrire à nouveau
<soap:address>. Si wsdl-host est défini au string jbossws.undefined.host, l'hôte du demandeur sera utilisé quand on écrit à nouveau une <soap:address>.
| /profile=default/subsystem=webservices/:write-attribute(name=wsdl-host,value=10.1.1.1) |
| wsdl-port | Entier relatif qui définit explicitement le port HTTP qui sera utilisé pour écrire à nouveau l'adresse SOAP. Si non défini, le port HTTP peut être identifié en cherchant la liste de connecteurs HTTP installés. | /profile=default/subsystem=webservices/:write-attribute(name=wsdl-port,value=8080)
|
| wsdl-secure-port | Entier relatif qui définit explicitement le port HTTPS qui sera utilisé pour écrire à nouveau l'adresse SOAP. Si non défini, le port HTTPS peut être identifié en cherchant la liste de connecteurs HTTPS installés. | /profile=default/subsystem=webservices/:write-attribute(name=wsdl-secure-port,value=8443)
|
Vous pouvez définir des configurations de points de terminaison qui peuvent être référencées par les implémentations de points de terminaison. Une des façons dont cela puisse être utilisé consiste à ajouter un gestionnaire donné à n'importe quel point de terminaison WS, pour lequel il est indiqué une configuration de point de terminaison donnée avec l'annotation @org.jboss.ws.api.annotation.EndpointConfig.
Standard-Endpoint-Config par défaut. Il existe également une configuration Recording-Endpoint-Config personnalisée, également incluse. Cela vous donne un exemple de gestionnaire d'enregistrement. La Standard-Endpoint-Config est utilisée automatiquement pour tout point de terminaison non associé à une autre configuration.
Standard-Endpoint-Config par le Management CLI, il suffit d'utiliser la commande suivante :
/profile=default/subsystem=webservices/endpoint-config=Standard-Endpoint-Config/:read-resource(recursive=true,proxies=false,include-runtime=false,include-defaults=true)
/profile=default/subsystem=webservices/endpoint-config=Standard-Endpoint-Config/:read-resource(recursive=true,proxies=false,include-runtime=false,include-defaults=true)
La configuration d'un point de terminaison, à laquelle on fait référence ainsi endpoint-config dans l'API de gestion, inclut pre-handler-chain, post-handler-chain et quelques propriétés qui sont appliquées à un point de terminaison particulier. Les commandes suivantes lisent et ajoutent un point de config.
Exemple 15.1. Lecture d'une config de point de terminaison
/profile=default/subsystem=webservices/endpoint-config=Recording-Endpoint-Config:read-resource
/profile=default/subsystem=webservices/endpoint-config=Recording-Endpoint-Config:read-resource
Exemple 15.2. Ajout d'une config de point de terminaison
/profile=default/subsystem=webservices/endpoint-config=My-Endpoint-Config:add
/profile=default/subsystem=webservices/endpoint-config=My-Endpoint-Config:add
Chaque config de point de terminaison peut être associée à des chaînes de gestionnaires PRE ou POST. Chaque chaîne de gestionnaire peut inclure des gestionnaires conformes à JAXWS. Pour les messages sortants, les gestionnaires de chaînes de gestionnaires PRE sont exécutés avant tout gestionnaire attaché aux points de terminaison, à l'aide de moyens JAXWS standards, comme avec l'annotation @HandlerChain. Les gestionnaires de chaînes de POST handler sont exécutés après les gestionnaires de points de terminaison habituels. Pour les messages entrants, c'est l'opposé. JAX-WS est une API standard pour les services basés XML, et est documenté à l'adresse suivante http://jcp.org/en/jsr/detail?id=224.
protocol-bindings, qui définit les protocoles qui déclenchent le démarrage de la chaîne.
Exemple 15.3. Lecture d'une chaîne de gestionnaire
/profile=default/subsystem=webservices/endpoint-config=Recording-Endpoint-Config/pre-handler-chain=recording-handlers:read-resource
/profile=default/subsystem=webservices/endpoint-config=Recording-Endpoint-Config/pre-handler-chain=recording-handlers:read-resource
Exemple 15.4. Ajouter un chaîne de gestionnaire
/profile=default/subsystem=webservices/endpoint-config=My-Endpoint-Config/post-handler-chain=my-handlers:add(protocol-bindings="##SOAP11_HTTP")
/profile=default/subsystem=webservices/endpoint-config=My-Endpoint-Config/post-handler-chain=my-handlers:add(protocol-bindings="##SOAP11_HTTP")
Un gestionnaire JAXWS est un handler (gestionnaire) d'élément dépendant, qui se trouve à l'intérieur d'une chaîne de gestionnaire. Le gestionnaire prend un attribut de classe , qui est le nom de classe complet de la classe du gestionnaire. Quand le point de terminaison est déployé, une instance de cette classe sera créée pour chaque déploiement référençant. Le chargeur de classes de déploiement ou le chargeur de classes du module org.jboss.as.webservices.server.integration doivent pouvoir charger la classe de gestionnaire.
Exemple 15.5. Lecture d'un gestionnaire
/profile=default/subsystem=webservices/endpoint-config=Recording-Endpoint-Config/pre-handler-chain=recording-handlers/handler=RecordingHandler:read-resource
/profile=default/subsystem=webservices/endpoint-config=Recording-Endpoint-Config/pre-handler-chain=recording-handlers/handler=RecordingHandler:read-resource
Exemple 15.6. Ajout d'un gestionnaire
/profile=default/subsystem=webservices/endpoint-config=My-Endpoint-Config/post-handler-chain=my-handlers/handler=foo-handler:add(class="org.jboss.ws.common.invocation.RecordingServerHandler")
/profile=default/subsystem=webservices/endpoint-config=My-Endpoint-Config/post-handler-chain=my-handlers/handler=foo-handler:add(class="org.jboss.ws.common.invocation.RecordingServerHandler")
Vous pouvez afficher des informations d'exécution sur les Services Web, tels que le contexte web et l'URL WSDL, en interrogeant les points de terminaison eux-mêmes. Vous pouvez utiliser le caractère de * pour interroger tous les points de terminaison à la fois. Les deux exemples suivants montrent la commande à la fois pour un serveur dans un domaine géré, et pour un serveur autonome.
Exemple 15.7. Voir les informations de runtime sur tous les points de terminaison d'un serveur web dans un domaine géré.
server-one qui se trouve sur l'hôte physique master et qui exécute sur un domaine géré.
/host=master/server=server-one/deployment="*"/subsystem=webservices/endpoint="*":read-resource
/host=master/server=server-one/deployment="*"/subsystem=webservices/endpoint="*":read-resource
Exemple 15.8. Voir les informations de runtime sur tous les points de terminaison d'un serveur web dans un domaine autonome.
/deployment="*"/subsystem=webservices/endpoint="*":read-resource
/deployment="*"/subsystem=webservices/endpoint="*":read-resource
Exemple 15.9. Exemple d'information de point de terminaison
15.3. Configurer le timeout HTTP par application Copier lienLien copié sur presse-papiers!
- Application - défini dans le fichier de configuration
web.xmlde l'application. - Serveur - indiqué par l'attribut
default-session-timeout. - Valeur par défaut - 30 minutes.
Procédure 15.1. Configurer le timeout HTTP par application
- Modifiez le fichier
WEB-INF/web.xmlde l'application. - Ajoutez le XML de configuration suivant au fichier, en remplaçant
30par la valeur de timeout souhaitée (en minutes).<session-config> <session-timeout>30</session-timeout> </session-config>
<session-config> <session-timeout>30</session-timeout> </session-config>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Si vous avez modifié le fichier WAR, déployez à nouveau l'application. Si vous éclatez le fichier WAR, aucune autre action ne sera nécessaire car JBoss EAP annulera et relancera automatiquement le déploiement de l'application.
15.4. Ponts de terminaison de services web JAX-WS Copier lienLien copié sur presse-papiers!
15.4.1. Les points de terminaison de Services Web JAX-WS Copier lienLien copié sur presse-papiers!
- Vous pouvez écrire les descripteurs WSDL manuellement.
- Si vous utilisez les annotations de JAX-WS qui créent les descripteurs WSDL automatiquement pour vous. Il s'agit de la méthode la plus commune pour créer des descripteurs WSDL.
Un service web doit se conformer aux conditions préalables de l'API JAXWS et à la spécification des métadonnées des services web qui se trouvent dans http://www.jcp.org/en/jsr/summary?id=181. Une implémentation valide devra remplir les critères suivants :
- Contenir une annotation
javax.jws.WebService. - Tous les paramètres de méthode et les types de renvoi doivent être compatibles avec la spécification JAXB 2.0, JSR-222. Voir http://www.jcp.org/en/jsr/summary?id=222 pour plus d'informations.
Exemple 15.10. Exemple de point de terminaison POJO
Exemple 15.11. Exemple de point de terminaison de Services Web
Exemple 15.12. Exposer un point de terminaison dans un EJB
Les services JAX-WS implémentent généralement une interface de point de terminaison de service Java (SEI), qui peut être mappée à partir d'un type de port WSDL, soit directement ou à l'aide d'annotations. Ce SEI fournit une abstraction de haut niveau qui masque les détails entre les objets Java et leurs représentations XML. Toutefois, dans certains cas, les services doivent pouvoir opérer au niveau du message XML. L'interface de point de terminaison Provider (fournisseur) fournit cette fonctionnalité aux Services Web qui l'implémentent.
Une fois que vous aurez déployé votre Service Web, vous pourrez consommer le WSDL pour créer les stubs de composants qui seront à la base de votre application. Votre application pourra alors accéder au point de terminaison et faire son travail.
Les JBoss EAP Quickstarts incluent plusieurs applications JAX-WS Web Services qui fonctionnent correctement. Exemples :
- wsat-simple
- wsba-coordinator-completion-simple
- wsba-participant-completion-simple
15.4.2. Écrire et déployer un point de terminaison de Service Web JAX-WS Copier lienLien copié sur presse-papiers!
Cette rubrique décrit le développement d'un simple point de terminaison du service JAX-WS, qui est le composant côté serveur qui répond aux demandes des clients JAX-WS et publie la définition WSDL pour lui-même. Pour plus d'informations sur les points de terminaison de service JAX-WS, consulter Section 15.6.2, « Référence API Commun JAX-WS » et la documentation de l'API en format Javadoc distribuée dans JBoss EAP 6.
Un service web doit se conformer aux pré-requis de l'API JAXWS et à la spécification des métadonnées des services web qui se trouvent dans http://www.jcp.org/en/jsr/summary?id=181. Une implémentation valide devra remplir les critères suivants :
- Contenir une annotation
javax.jws.WebService. - Tous les paramètres de méthode et les types de renvoi doivent être compatibles avec la spécification JAXB 2.0, JSR-222. Voir http://www.jcp.org/en/jsr/summary?id=222 pour plus d'informations.
Exemple 15.13. Exemple d'implémentation de service
Exemple 15.14. Exemple de charge XML
DiscountRequest utilisée par le bean ProfileMgmtBean dans l'exemple précédent. Les annotations sont incluses par souci de verbosité. Normalement, les valeurs par défaut JAXB sont raisonnables et n'ont pas besoin d'être spécifiées.
La classe d'implémentation est encapsulée dans un déploiement de JAR. Toutes les métadonnées requises pour le déploiement proviennent des annotations qui se trouvent sur la classe d'implémentation et l'interface de point de terminaison de service. Déployer le JAR à l'aide du Management CLI ou de l'Interface de gestion, et le point de terminaison HTTP sera créé automatiquement.
Exemple 15.15. Exemple de structure JAR pour un déploiement de service web
15.5. Clients du service JAX-WS Web Copier lienLien copié sur presse-papiers!
15.5.1. Consommer et accéder à un Service Web JAX-WS Copier lienLien copié sur presse-papiers!
- Créer les artefacts client.
- Construire un service stub.
- Accéder au point de terminaison.
Avant de pouvoir créer des artefacts client, vous devrez créer votre contrat WSDL. Le contrat WSDL suivant est utilisé dans les exemples présentés dans le reste de cette section.
ProfileMgmtService.wsdl.
Exemple 15.16. Exemple de contrat WSDL
Note
wsconsume.sh ou wsconsume.bat est utilisé pour consommer le contrat abstrait (WSDL) et produire les classes Java annotées et les sources optionnelles qui le définissent. La commande se trouve dans le répertoire EAP_HOME/bin/ de l'installation JBoss EAP 6.
Exemple 15.17. Syntaxe de la commande wsconsume.sh
.java listés dans la sortie, à partir du fichier ProfileMgmtService.wsdl. Les sources utilisent la structure de répertoire du package, qui est spécifié par le commutateur -p.
.java et les fichiers .class compilés sont générés dans le répertoire output/ qui se trouve dans le répertoire où vous exécutez la commande.
| Fichier | Description |
|---|---|
ProfileMgmt.java
|
Interface de point de terminaison de service.
|
Customer.java
|
Personnaliser le type de données.
|
Discount*.java
|
Personnaliser les types de données.
|
ObjectFactory.java
|
Référentiel JAXB XML.
|
package-info.java
|
Annotations de package JAXB.
|
ProfileMgmtService.java
|
Usine de connexions.
|
wsconsume.sh génère tous les types de données personnalisés (classes JAXB annotées), l'interface de point de terminaison de service et une classe de fabrique de services. Ces artefacts sont utilisés pour créer les implémentations web service clients.
Les clients de service Web permet d'abstraire les détails d'un appel de service web distant stubs de service. Pour une application cliente, une invocation WS ressemble à une invocation de tout autre composant de l'entreprise. Dans ce cas, l'interface de point de terminaison de service agit comme l'interface de l'entreprise, et une classe de fabrique de service n'est pas utilisée pour sa construction comme une ébauche de service.
Exemple 15.18. Créer un Service Stub et accéder à un point de terminaison
wsconsume.sh pour construire le stub de service. Enfin, le stub peut être utilisé comme le serait toute autre interface commerciale.
15.5.2. Développer une application client JAX-WS Copier lienLien copié sur presse-papiers!
Service
- Aperçu
- Un
Serviceest une abstraction qui représente un service WSDL. Un service WSDL est une collection de ports liés les uns aux autres, dont chacun comprend un type de port lié à un protocole particulier et une adresse de point de terminaison particulière.Généralement, le service est créé quand le reste des stubs du composant sont générés à partir d'un contrat WSDL existant. Le contrat WSDL est disponible via l'URL WSDL du point de terminaison déployé, ou peut être créé à partir de la source de point de terminaison à l'aide de la commandewsprovide.shdans le répertoire de/bin/ EAP_HOME.On appelle cela une utilisation statique. Dans un tel cas, vous créez des instances de la classeService, créée elle-même comme un des composants stubs.Vous pouvez également créer le service manuellement, par la méthodeService.create. On appelle cela une utilisation dynamic. - Utilisation
- Cas d'utilisation static
- Le cas d'utilisation statique pour un client JAX-WS suppose que vous ayiez déjà un contrat WSDL. Ceci peut être généré par un outil externe ou généré à l'aide des annotations JAX-WS qui conviennent lorsque vous créez votre point de terminaison de JAX-WS.Pour générer vos stubs de composants, vous pouvez utiliser le script
wsconsume.shouwsconsume.batinclus dansEAP_HOME/bin/. Ce script prend le WSDL URL ou fichier en tant que paramètre, et génère de nombreux fichiers structurés dans un arborescence de répertoires. La source et les fichiers de classe représentant votreServices'appellentCLASSNAME_Service.javaetCLASSNAME_Service.class, respectivement.La classe d'implémentation générée possède deux constructeurs publics, un sans argument et un avec deux arguments. Les deux arguments représentent respectivement l'emplacement WSDL (unjava.net.URL) et le nom du service (unjavax.xml.namespace.QName).Le constructeur sans argument est celui qui est le plus souvent utilisé. Dans ce cas, l'emplacement WSDL et le nom du service sont ceux que l'on trouve dans le fichier WSDL. Ceux-ci sont définis implicitement à partir de l'annotation@WebServiceClientqui décore la classe générée.Exemple 15.19. Exemple de classe de service générée
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Cas d'utilisation dynamic
- Dans un cas d'utilisation dynamic, aucun stub n'est généré automatiquement. Au lieu de cela, le client de service web utilise la méthode
Service.createpour créer des instances deService. Le fragment de code suivant illustre ce processus.Exemple 15.20. Création de service manuellement
URL wsdlLocation = new URL("http://example.org/my.wsdl"); QName serviceName = new QName("http://example.org/sample", "MyService"); Service service = Service.create(wsdlLocation, serviceName);URL wsdlLocation = new URL("http://example.org/my.wsdl"); QName serviceName = new QName("http://example.org/sample", "MyService"); Service service = Service.create(wsdlLocation, serviceName);Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- Handler Resolver
- JAX-WS fournit un framework plug-in flexible pour des modules de traitement des messages, appelés gestionnaires. Ces gestionnaires étendent les fonctionnalités d'un système de runtime JAX-WS. Une instance de
Servicedonnera accès à unHandlerResolvergrâce à une paire de méthodesgetHandlerResolveretsetHandlerResolverqui peuvent configurer un ensemble de gestionnaires sur la base de service, de port ou de protocole.Lorsqu'une instance deServicecrée un proxy ou une instanceDispatch, le Handler Resolver enregistré dans le service crée la chaîne de gestionnaires requise. Les changements ultérieurs apportés au Handler Resolver qui sont configurés pour une instance deServicen'affectent pas les gestionnaires sur proxies préalablement créés ou les instances deDispatch. - Exécuteur
- Les instances de
Servicepeuvent être configurées par unjava.util.concurrent.Executor.Executorinvoque les callbacks asynchrones demandés par l'application. Les méthodessetExecutoretgetExecutordeServicepeuvent modifier et extraire l'Executorconfiguré pour un service.
Un dynamic proxy est une instance de proxy de client utilisant une des méthodes getPort fournie par le Service. Le portName indique le nom du port WSDL que le service utilise. La serviceEndpointInterface indique l'interface du point de terminaison du service prise en charge par l'instance du proxy dynamique créé.
Exemple 15.21. Méthodes getPort
public <T> T getPort(QName portName, Class<T> serviceEndpointInterface) public <T> T getPort(Class<T> serviceEndpointInterface)
public <T> T getPort(QName portName, Class<T> serviceEndpointInterface)
public <T> T getPort(Class<T> serviceEndpointInterface)
wsconsume.sh qui interprète le WSDL et qui, à partir de cela, crée des classes Java.
Exemple 15.22. Renvoie le Port d'un Service
@WebServiceRef
L'annotation @WebServiceRef déclare une référence à un Service Web. Elle suit un modèle de ressource indiqué par l'annotation javax.annotation.Resource définie dans http://www.jcp.org/en/jsr/summary?id=250.
Cas d'utilisateur @WebServiceRef
- Vous pouvez l'utiliser pour définir une référence dont le type est une classe de
Servicegénérée. Dans ce cas, l'élément de valeur et le type font tous deux référence au type de classe deServicegénéré. En outre, si le type de référence peut être déduit grâce au champ ou à la déclaration de méthode à laquelle l'annotation est s'applique, les éléments de type et de valeur peuvent (mais n'y sont pas tenus) avoir la valeur par défaut deObject.class. Si le type ne peut pas être déduit, alors l'élément au moins doit être présent, avec une valeur par défaut. - Vous pouvez l'utiliser pour définir une référence de type SEI. Dans ce cas, l'élément de type peut (mais pas forcément) se présenter avec sa valeur par défaut si le type de référence peut être déduit de la déclaration de champ ou de méthode annotée. Toutefois, l'élément de valeur doit toujours être présent et faire référence à un type de classe de service généré, qui est un sous-type de
javax.xml.ws.Service. L'élémentwsdlLocation, s'il est présent, substitue les informations d'emplacement WSDL spécifiées dans l'annotation@WebServicede la classe de service générée référencée.Exemple 15.23. Exemples de
@WebServiceRefCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Les Services Web XML utilisent des messages XML pour la communication entre le point de terminaison, qui est déployé dans le conteneur Java EE, et tous les clients. Les messages XML utilisent un langage XML appelé Simple Object Access Protocol (SOAP). L'API JAX-WS fournit les mécanismes pour que le point de terminaison et les clients puissent chacun être en mesure d'envoyer et de recevoir des messages SOAP. Le Marshalling, ou conversion de paramètres, est l'action de convertir le message XML SOAP en Objet Java.
Dispatch fournit cette fonctionnalité. Dispatch opère dans un des deux modes d'utilisation, qui sont identifiés par l'une des constantes suivantes.
javax.xml.ws.Service.Mode.MESSAGE- ce mode ordonne aux applications clientes de travailler directement avec les structures de message qui sont spécifiques au protocole. Si utilisé avec une liaison de protocole SOAP, une application cliente fonctionne directement avec un message SOAP.javax.xml.ws.Service.Mode.PAYLOAD- ce mode amène le client à travailler avec la charge elle-même. Par exemple, s'il est utilisé avec une liaison de protocole SOAP, une application cliente travaillera alors avec le contenu SOAP plutôt qu'avec l'intégralité du message SOAP.
Dispatch est une API de bas niveau qui exige des clients de structurer les messages ou les charges en XML, avec une adhérence stricte aux normes du protocole individuel et une connaissance approfondie de la structure de message ou de la charge. Dispatch est une classe générique qui prend en charge l'entrée et la sortie des messages ou des charges de message de n'importe quel type.
Exemple 15.24. Utilisation de Dispatch
L'interface BindingProvider représente un composant qui fournit une liaison de protocole que les clients peuvent utiliser. Elle est implémentée et étendue par l'interface Dispatch.
BindingProvider peuvent fournir des possibilités d'opérations asynchrones. Comme les opérations asynchrones, les invocations sont découplées de l'instance BindingProvider au moment de l'invocation. Le contexte de réponse n'est pas mis à jour lorsque l'opération est terminée. Au lieu de cela, un contexte de réponse distinct est fourni à l'aide de l'interface de réponse.
Exemple 15.25. Invocation asynchrone
@Oneway
L'annotation @Oneway indique que la méthode web donnée ne prend un message d'entrée mais ne renvoie aucun message de sortie. Habituellement, une méthode @Oneway renvoie le thread de contrôle à l'application appelante avant l'exécution de la méthode commerciale.
Exemple 15.26. Exemple d'invocation @Oneway
Il y a deux propriétés qui contrôlent le comportement du délai d'expiration de la connexion HTTP et le délai d'attente d'un client qui attend de recevoir un message. Le premier est javax.xml.ws.client.connectionTimeout et le second est javax.xml.ws.client.receiveTimeout. Chacun est exprimé en millisecondes, et la syntaxe correcte est indiquée ci-dessous.
Exemple 15.27. Configuration de timeout JAX-WS
15.6. Référence de développement JAX-WS Copier lienLien copié sur presse-papiers!
15.6.1. Activation de WS-Addressing (Web Services Addressing) Copier lienLien copié sur presse-papiers!
Conditions préalables
- Votre application doit posséder un service JAX-WS et une configuration client.
Procédure 15.2. Annoter et mettre à jour le code client
Annoter le point de terminaison du service
Ajouter l'annotation@Addressingau code du point de terminaison de l'application.Exemple 15.28. annotation
@AddressingCet exemple montre un point de terminaison normal avec l'ajout de l'annotation@Addressing.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Mise à jour du code client
Mettez à jour le code client dans l'application pour configurer WS-Addressing.Exemple 15.29. La configuration client pour WS-Addressing
Cet exemple montre un client JAX-WS mis à jour pour configurer WS-Addressing.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Le client et le point de terminaison communiquent maintenant avec WS-Addressing.
15.6.2. Référence API Commun JAX-WS Copier lienLien copié sur presse-papiers!
Le framework de gestionnaires est implémenté par une liaison de protocole de JAX-WS dans le runtime du client et le point de terminaison, qui est le composant de serveur. Les proxies et les instances Dispatch, connus collectivement en tant que fournisseurs de liaison, chacun utilisant des liaisons de protocole pour lier leur fonctionnalité abstraite à des protocoles spécifiques.
Types de gestionnaires de messages
- Gestionnaire logique
- Les gestionnaires logiques n'opèrent que sur des propriétés de contexte de messages et sur des charges utiles de messages. Les gestionnaires logiques sont libérés des protocoles et ne peuvent pas affecter les parties d'un message qui soient spécifiques à un protocole. Les gestionnaires logiques implémentent l'interface
javax.xml.ws.handler.LogicalHandler. - Gestionnaire de protocoles
- Les gestionnaires de protocoles fonctionnent sur des propriétés de contexte de message et des messages de protocole spécifique. Les gestionnaires de protocoles sont spécifiques à un protocole particulier et peuvent accéder et modifier les aspects spécifiques d'un protocole de message. Les gestionnaires de protocoles implémentent une interface dérivée de
javax.xml.ws.handler.Handler except javax.xml.ws.handler.LogicalHandler. - Gestionnaire de points de terminaison
- Sur un point de terminaison de service, les gestionnaires sont définis à l'aide de l'annotation
@HandlerChain. L'emplacement du fichier de chaîne de gestionnaires peut être soit unjava.net.URLabsolu dansexternalFormou un chemin d'accès relatif du fichier source ou du fichier de classe.Exemple 15.30. Exemple de gestionnaire de points de terminaison
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Service Client Handler
- Sur un client JAX-WS, les gestionnaires sont définis soit en utilisant l'annotation
@HandlerChain, comme dans les points de terminaison de service, soit de façon dynamique, à l'aide de l'API JAX-WS.Exemple 15.31. Définir un Service Client Handler par une API
Copy to Clipboard Copied! Toggle word wrap Toggle overflow L'appel à la méthodesetHandlerChainest requis.
L'interface MessageContext est une super interface pour tous les contextes de message JAX-WS. Elle étend Map <String,Object> de méthodes et des constantes supplémentaires pour gérer un ensemble de propriétés qui permettent aux gestionnaires d'une chaîne de gestionnaires de partager l'état connexe de traitement. Par exemple, un gestionnaire peut utiliser la méthode put pour insérer une propriété dans le contexte du message. Un ou plusieurs autres gestionnaires de la chaîne de gestionnaires peuvent obtenir par la suite le message via la méthode get.
APPLICATION ou GESTIONNAIRE. Toutes les propriétés sont disponibles pour tous les gestionnaires d'une instance d'un modèle d'échange de messages ou MEP (de l'anglais Message Exchange Pattern) d'un point de terminaison particulier. Par exemple, si un gestionnaire logique met une propriété dans le contexte du message, cette propriété sera également disponible à tous les gestionnaires de protocole dans la chaîne au cours de l'exécution d'une instance MEP.
Note
APPLICATION sont également rendues disponibles en tant qu'applications clients et implémentations de point de terminaison de services. Le defaultscope d'une propriété est HANDLER par défaut.
- Contexte de message logique
- Lorsque les gestionnaires logiques sont invoqués, ils reçoivent un contexte de message de type
LogicalMessageContext. LeLogicalMessageContextétendMessageContextpar des méthodes qui récupèrent et modifient la charge du message. Il ne donne pas accès aux aspects spécifiques au protocole d'un message. Une liaison de protocole définit quels composants d'un message sont disponibles via un contexte logique message. Un gestionnaire logique déployé dans une liaison SOAP peut accéder au contenu du corps SOAP, mais pas aux en-têtes SOAP. En revanche, la liaison XML/HTTP définit qu'un gestionnaire de logique accède à l'entière charge XML d'un message. - Contexte de message SOAP
- Quand les gestionnaires SOAP sont invoqués, ils reçoivent un
SOAPMessageContext. LeSOAPMessageContextétendMessageContextpar des méthodes qui obtiennent et modifient la charge du message SOAP.
Une application peut lever une SOAPFaultException ou une exception spécifique à l'application utilisateur. Dans ce dernier cas, les wrapper beans de faute requis seront générés en cours d'exécution s'ils ne font pas déjà partie du déploiement.
Exemple 15.32. Exemple de gestion des fautes
public void throwApplicationException() throws UserException
{
throw new UserException("validation", 123, "Some validation error");
}
public void throwApplicationException() throws UserException
{
throw new UserException("validation", 123, "Some validation error");
}
Les annotations disponibles via JAX-WS API sont définies dans JSR-224, que l'on peut trouver à l'adresse suivante http://www.jcp.org/en/jsr/detail?id=224. Ces annotations sont dans le package javax.xml.ws.
javax.jws.
Chapitre 16. WebSockets Copier lienLien copié sur presse-papiers!
16.1. WebSockets Copier lienLien copié sur presse-papiers!
Upgrade. Toutes les communications sont alors en full-duplex sur la même connexion TCP/IP, avec une charge minimale de données. Comme chaque message n'inclut pas de contenu d'en-tête HTTP inutile, les communications Websocket nécessitent moins de bandwidth. Le résultat est une voie de communication de faible latence, adaptée aux applications nécessitant une réactivité en temps réel.
16.2. Créer une application WebSocket Copier lienLien copié sur presse-papiers!
- Un client Java ou un client WebSocket : http://caniuse.com/websockets
- Une classe de point de terminaison de serveur WebSocket.
- Un fichier
jboss-web.xmlconfiguré pour activer WebSockets. - Dépendances de projet configurées pour déclarer une dépendance sur l'API WebSocket.
- Activer le connecteur
NIO2dans le sous-systèmewebdu fichier de configuration du serveur Red Hat JBoss Enterprise Application Platform.
Note
Procédure 16.1. Créer l'application WebSocket
Créer un client HTML JavaScript.
Voici un exemple de client WebSocket. Il contient les fonctions JavaScript suivantes :lconnect(): cette fonction crée la connexion webSocket qui donne l'URI de WebSocket. L'emplacement de la ressource correspond à la ressource définie dans la classe de point de terminaison du serveur. Cette fonction intercepte et gère les WebSocketsonopen,onmessage,onerror, etonclose.sendMessage(): cette fonction a le même nom que celui qui se trouve sur le formulaire, crée un message, et l'envoie par la commande WebSocket.send().disconnect(): cette fonction génère la commande WebSocket.close().displayMessage(): cette fonction détermine le message affiché sur la page à la valeur donnée par la méthode de point de terminaison de WebSocket.displayStatus(): cette fonction affiche le statut de la connexion de WebSocket.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Créer le point de terminaison du serveur de WebSocket.
Vous pouvez créer un point de terminaison de serveur WebSocket par l'une des méthodes suivantes.L'exemple de code ci-dessous utilise une approche de point de terminaison annoté et gère les événements suivants.Programmatic Endpoint: le point de terminaison prolonge la classe de point de terminaison.Annotated Endpoint: la classe de point de terminaison utilise des annotations pour interagir avec les événements WebSocket. Plus facile à codifier qu'un point de terminaison programmatique.
- L'annotation
@ServerEndpointidentifie cette classe comme point de terminaison de serveur WebSocket et indique le chemin d'accès. - L'annotation
@OnOpens'active quand la connexion de WebSocket est ouverte. - L'annotation
@OnMessages'active quand un message est envoyé vers une connexion de WebSocket. - L'annotation
@OnCloses'active quand la connexion de WebSocket est fermée.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Configurer le fichier jboss-web.xml.
Vous devez créer l'élément<enable-websockets>dans l'applicationWEB-INF/jboss-web.xmlet la définir àtrue.<?xml version="1.0" encoding="UTF-8"?> <!--Enable WebSockets --> <jboss-web> <enable-websockets>true</enable-websockets> </jboss-web>
<?xml version="1.0" encoding="UTF-8"?> <!--Enable WebSockets --> <jboss-web> <enable-websockets>true</enable-websockets> </jboss-web>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Déclarer la dépendance de l'API de Websocket dans votre fichier POM de projet.
Si vous utilisez Maven, vous devrez ajouter la dépendance suivante au fichierpom.xmldu projet.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Configurer le serveur JBoss EAP.
Configurer le<connector>httpdans le sous-systèmewebdu fichier de configuration du serveur pour qu'il puisse utliser le protocoleNIO2.- Démarrer le serveur JBoss EAP.
- Lancer l'interface CLI par la commande pour votre système d'exploitation.Dans Linux :Dans Windows :
EAP_HOME/bin/jboss-cli.sh --connect
EAP_HOME/bin/jboss-cli.sh --connectCopy to Clipboard Copied! Toggle word wrap Toggle overflow EAP_HOME\bin\jboss-cli.bat --connect
EAP_HOME\bin\jboss-cli.bat --connectCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Pour activer le protocole connecteur
NIO2Java non-bloquant dans le sous-systèmewebdu fichier de configuration du serveur JBoss EAP, saisissez la commande suivante./subsystem=web/connector=http/:write-attribute(name=protocol,value=org.apache.coyote.http11.Http11NioProtocol)
/subsystem=web/connector=http/:write-attribute(name=protocol,value=org.apache.coyote.http11.Http11NioProtocol)Copy to Clipboard Copied! Toggle word wrap Toggle overflow Quelle que soit la commande dont il s'agit, vous devrez voir le résultat suivant apparaître :Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Indiquer au serveur de charger la configuration à nouveau.
:reload
:reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow Vous devriez voir apparaître le résultat suivant :{ "outcome" => "success", "result" => undefined }{ "outcome" => "success", "result" => undefined }Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Réviser les changements apportés au fichier de configuration du serveur JBoss EAP. Le sous-système
webdoit maintenant contenir l'XML suivant pour le<connector>http.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Chapitre 17. Identité au sein d'applications Copier lienLien copié sur presse-papiers!
17.1. Concepts de base Copier lienLien copié sur presse-papiers!
17.1.1. Cryptage Copier lienLien copié sur presse-papiers!
17.1.2. Les domaines de sécurité Copier lienLien copié sur presse-papiers!
17.1.3. Cryptage SSL Copier lienLien copié sur presse-papiers!
Avertissement
17.1.4. Sécurité déclarative Copier lienLien copié sur presse-papiers!
17.2. Sécurité basée-rôle pour les applications Copier lienLien copié sur presse-papiers!
17.2.1. La sécurité des applications Copier lienLien copié sur presse-papiers!
17.2.2. Authentification Copier lienLien copié sur presse-papiers!
17.2.3. L'autorisation Copier lienLien copié sur presse-papiers!
17.2.4. Security Auditing Copier lienLien copié sur presse-papiers!
17.2.5. Mappage de sécurité Copier lienLien copié sur presse-papiers!
17.2.6. Java Authentication et Authorization Service (JAAS) Copier lienLien copié sur presse-papiers!
17.2.7. Java Authentication et Authorization Service (JAAS) Copier lienLien copié sur presse-papiers!
Les groupes de serveurs (dans un domaine géré) et les serveurs (dans un serveur autonome) comprennent une configuration des domaines de la sécurité. Un domaine de sécurité comprend des informations sur une combinaison d'authentification, d'autorisation, de mappage et de modules, avec détails de configuration. Une application spécifie quel domaine de sécurité est exigé, par son nom, dans son fichier jboss-web.xml.
Une configuration spécifique à une application a lieu dans un ou plusieurs fichiers.
| Fichier | Description |
|---|---|
| ejb-jar.xml |
Le descripteur de déploiement pour une application Enterprise JavaBeans (EJB), situé dans le répertoire
META-INF de l'archive. Utiliser le fichier ejb-jar.xml pour préciser les rôles et les mapper aux principaux, au niveau de l'application. Vous pouvez également limiter certaines méthodes et classes spécifiques à certains rôles. Également utilisé pour les autres configurations EJB spécifiques non liées à la sécurité.
|
| web.xml |
Le descripteur de déploiement pour une application web en Java Enterprise Edition (EE). Utilisez le fichier
web.xml pour déclarer les contraintes de transport et ressources, comme limiter les types de demandes HTTP autorisées. Vous pouvez également configurer l'authentification basée-web dans ce fichier. Utilisé également pour d'autres configurations spécifiques à l'application non liées à la sécurité. Le domaine de sécurité que l'application utilise pour l'authentification et l'autorisation est défini dans jboss-web.xml.
|
| jboss-ejb3.xml |
Contient des extensions au descripteur
ejb-jar.xml spécifiques à JBoss.
|
| jboss-web.xml |
Contient des extensions au descripteur
web.xml spécifiques à JBoss.
|
Note
ejb-jar.xml et web.xml sont définis dans la spécification Java Enterprise Edition (Java EE). Le fichier jboss-ejb3.xml fournit des extensions spécifiques à JBoss pour le fichier ejb-jar.xml, et le fichier jboss-web.xml fournit des extensions spécifiques à JBoss pour le fichier web.xml.
17.2.8. Utiliser un domaine de sécurité dans votre application Copier lienLien copié sur presse-papiers!
Pour utiliser un domaine de sécurité dans votre application, vous devez tout d'abord définir le domaine dans le fichier de configuration du serveur, puis vous devez l'activer pour une application dans le descripteur de déploiement de l'application. Ensuite, vous devez ajouter les annotations requises à l'EJB qui les utilise. Cette rubrique décrit les étapes requises pour utiliser un domaine de sécurité dans votre application.
Avertissement
Procédure 17.1. Configurez votre application pour qu'elle puisse utiliser un domaine de sécurité
Définir le domaine de sécurité
Vous devez définir le domaine de sécurité dans le fichier de configuration du serveur, puis l'activer pour une application dans le fichier du descripteur de l'application.Configurez le domaine de sécurité dans le fichier de configuration du serveur
Le domaine de sécurité est configuré dans le sous-système desécuritédu fichier de configuration du serveur. Si l'instance de JBoss EAP 6 s'exécute dans un domaine géré, il s'agira du fichierdomain/configuration/domain.xml. Si l'instance de JBoss EAP 6 s'exécute comme un serveur autonome, ce sera le fichierstandalone/configuration/standalone.xml.Les domaines de sécuritéother,jboss-web-policy, etjboss-ejb-policysont fournis par défaut dans JBoss EAP 6. L'exemple XML suivant a été copié à partir du sous-système desécuritédans le fichier de configuration du serveur.L'attributcache-typed'un domaine de sécurité spécifie un cache pour pouvoir effectuer des contrôles d'authentification plus rapides. Les valeur autorisées sont les valeurs pardéfauten cas de simple mappe comme cache ouinfinispanpour un cache Infinispan.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Vous pouvez configurer des domaines de sécurité supplémentaires selon les besoins par la console de gestion ou par l'interface CLI.Activer le domaine de sécurité dans le fichier de descripteur de l'application.
Le domaine de sécurité est spécifié dans l'élément enfant<security-domain>de l'élément<jboss-web>du fichierWEB-INF/jboss-web.xmlde l'application. L'exemple suivant configure un domaine de sécurité nommémy-domain.<jboss-web> <security-domain>my-domain</security-domain> </jboss-web><jboss-web> <security-domain>my-domain</security-domain> </jboss-web>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Il s'agit d'une des configurations que vous pouvez indiquer dans le descripteurWEB-INF/jboss-web.xml.
Ajoutez l'annotation requise à l'EJB.
Vous pouvez configurer la sécurité dans EJB par les annotations@SecurityDomainet@RolesAllowed. L'exemple de code EJB suivant limite l'accès au domaine de sécuritéotheraux utilisateurs ayant pour rôleguest(invité).Copy to Clipboard Copied! Toggle word wrap Toggle overflow Pour obtenir des exemples de code supplémentaires, voirejb-securityQuickstart dans le package JBoss EAP 6 Quickstarts disponible à partir du portail clients de Red Hat.
17.2.9. Utilisation de la sécurité basée-rôle dans les Servlets Copier lienLien copié sur presse-papiers!
jboss-web.xml du WAR.
Avant d'utiliser la sécurité basée-rôles dans un servlet, le domaine de sécurité utilisé pour authentifier et autoriser l'accès doit être configuré sur la plateforme JBoss EAP 6.
Procédure 17.2. Ajout de la sécurité basée-rôle dans les servlets
Ajout de mappages entre les types d'URL et les servlets.
Utiliser les éléments<servlet-mapping>du fichierweb.xmlpour mapper les servlets individuels à des types d'URL. L'exemple suivant mappe le serveur nomméDisplayOpResultau type d'URL/DisplayOpResult.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Ajout des contraintes de sécurité aux types d'URL.
Pour mapper le type d'URL avec une contrainte de sécurité, utilisez un<security-constraint>. L'exemple suivant limite l'accès d'un type d'URL/DisplayOpResultafin qu'il soit accessible aux principaux ayant pour rôleeap_admin. Le rôle doit être présent dans le domaine de sécurité.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Vous aurez besoin d'indiquer la méthode d'authentification, qui peut être une des méthodes suivantes :BASIC, FORM, DIGEST, CLIENT-CERT, SPNEGO.. Cet exemple utilise l'authentificationBASIC.Indiquez le domaine de sécurité et le fichier
jboss-web.xmldu WAR.Ajoutez le domaine de sécurité au fichierjboss-Web.xmldu WAR afin de connecter les servlets au domaine de la sécurité configuré sachant comment authentifier et autoriser les principaux selon les contraintes de sécurité. L'exemple suivant utilise le domaine de sécurité appeléacme_domain.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Exemple 17.1. Exemple web.xml avec la sécurité basée rôle configurée.
17.2.10. Utilisation d'une authentification système de tierce partie pour votre application Copier lienLien copié sur presse-papiers!
Note
context.xml. Les valves sont configurées directement dans le descripteur jboss-web.xml à la place. Le fichier context.xml peut maintenant être ignoré.
Exemple 17.2. Valve d'authentification de base
Exemple 17.3. Personnaliser une valve avec des attributs d'en-tête
Rédiger vous-même votre authentificateur est en dehors de la portée de ce document. Cependant, le code Java suivant est fourni comme exemple.
Exemple 17.4. GenericHeaderAuthenticator.java
17.3. Domaines de sécurité Copier lienLien copié sur presse-papiers!
17.3.1. Domaines de sécurité Copier lienLien copié sur presse-papiers!
ManagementRealmstocke les informations d'authentification pour l'API de gestion, qui fournit les fonctionnalités pour l'interface CLI et la Console de gestion sur le web. Il fournit un système d'authentification pour gérer JBoss EAP 6 . Vous pouvez également utiliser leManagementRealmsi votre application a besoin des mêmes règles commerciales que vous utilisez pour l'API de gestion, lors de son authentification.ApplicationRealmstocke l'utilisateur, le mot de passe et les informations de rôle pour les applications Web et les EJB.
REALM-users.propertiesstocke les mots de passe et les mots de passe hachés.REALM-roles.propertiesstocke les mappages user-to-role.mgmt-groups.propertiesstocke le fichier de mappage user-to-group pourManagementRealm. Utilisé uniquement quand RBAC (Role-based Access Control) est activé.
domain/configuration/ et standalone/configuration/. Les fichiers sont inscrits simultanément par la commande add-user.sh ou add-user.bat. Quand vous exécutez la commande, la première décision est de décider dans quel domaine ajouter votre premier utilisateur.
17.3.2. Ajout d'un domaine de sécurité Copier lienLien copié sur presse-papiers!
Exécuter l'interface CLI
Démarrez par la commandejboss-cli.shoujboss-cli.batet connectez-vous au serveur.Créer le nouveau domaine de sécurité lui-même.
Exécutez la commande suivante pour créer un nouveau domaine de sécurité nomméMyDomainRealmsur un contrôleur de domaine ou sur un serveur autonome.Pour une instance de domaine, utiliser la commande suivante :/host=master/core-service=management/security-realm=MyDomainRealm:add()
/host=master/core-service=management/security-realm=MyDomainRealm:add()Copy to Clipboard Copied! Toggle word wrap Toggle overflow Pour une instance autonome, utiliser la commande suivante :/core-service=management/security-realm=MyDomainRealm:add()
/core-service=management/security-realm=MyDomainRealm:add()Copy to Clipboard Copied! Toggle word wrap Toggle overflow Créer les références du fichier de propriétés qui stocke les informations sur le nouveau rôle.
Exécutez la commande suivante pour créer un pointeur au fichier nommémyfile.properties, qui contiendra les propriétés attachées au nouveau rôle.Note
Le fichier de propriétés nouvellement créées n'est pas géré par les scriptsadd-user.shetadd-user.batinclus. Il devra être administré en externe.Pour une instance de domaine, utiliser la commande suivante :/host=master/core-service=management/security-realm=MyDomainRealm/authentication=properties:add(path=myfile.properties)
/host=master/core-service=management/security-realm=MyDomainRealm/authentication=properties:add(path=myfile.properties)Copy to Clipboard Copied! Toggle word wrap Toggle overflow Pour une instance autonome, utiliser la commande suivante :/core-service=management/security-realm=MyDomainRealm/authentication=properties:add(path=myfile.properties)
/core-service=management/security-realm=MyDomainRealm/authentication=properties:add(path=myfile.properties)Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Votre nouveau domaine de sécurité sera créé. Lorsque vous ajoutez des utilisateurs et des rôles à ce nouveau domaine, l'information va être stockée dans un fichier séparé des domaines de sécurité par défaut. Vous pouvez gérer ce nouveau fichier à l'aide de vos propres applications ou procédures.
17.3.3. Ajout d'un utilisateur à un domaine de sécurité Copier lienLien copié sur presse-papiers!
Éxécuter la commande
add-user.shouadd-user.bat.Ouvrez un terminal (shell) et changez de répertoireEAP_HOME/bin/. Si vous exécutez Red Hat Enterprise Linux ou un autre système d'exploitation style UNIX, exécutezadd-user.sh. Si vous exécutez sur un serveur Microsoft Windows, exécutezadd-user.bat.Choisir d'ajouter un utilisateur de gestion ou un utilisateur d'application.
Pour cette procédure, saisirbpour ajouter un utilisateur d'application.Choisir le domaine dans lequel l'utilisateur sera ajouté.
Par défaut, le seul domaine disponible estApplicationRealm. Si vous avez ajouté un domaine personnalisé, vous pouvez saisir son nom à la place.Saisir le nom d'utilisateur, le mot de passe et les rôles lorsque vous y serez invité.
Saisir le nom d'utilisateur, le mot de passe et les rôles lorsque vous y serez invité. Vérifiez votre choix en tapantyes, ounopour annuler les changements. Les changements sont inscrits dans les fichiers de propriétés du domaine de sécurité.
17.4. Sécurité des applications EJB Copier lienLien copié sur presse-papiers!
17.4.1. Identité Sécurité Copier lienLien copié sur presse-papiers!
17.4.1.1. L'identité de sécurité EJB Copier lienLien copié sur presse-papiers!
17.4.1.2. Définir l'identité de sécurité d'un EJB Copier lienLien copié sur presse-papiers!
<security-identity> dans la configuration de la sécurité.
<security-identity> n'est présente - l'identité de l'appelant de l'EJB sera utilisée.
Exemple 17.5. Définir l'identité de sécurité d'un EJB pour que ce soit la même que celle de l'appelant
<security-identity>.
Exemple 17.6. Définir l'idendité de sécurité d'un EJB à un rôle spécifique
<run-as> et les balises <role-name> dans la balise <security-identity>.
<run-as>, un principal nommé anonymous est assigné aux appels sortants. Pour assigner un autre principal, utiliser <run-as-principal>.
Note
<run-as> et <run-as-principal> à l'intérieur d'un élément de servlet.
Voir également :
17.4.2. Permissions de méthodes EJB Copier lienLien copié sur presse-papiers!
17.4.2.1. Permissions de méthodes EJB Copier lienLien copié sur presse-papiers!
<method-permisison> définit les rôles qui peuvent appeler des méthodes de l'interface EJB. Vous pouvez définir des permissions pour les combinaisons suivantes :
- Toutes les méthodes d'interface de composant ou d'accueil de l'EJB nommé
- Une méthode spécifiée d'interface de composant ou d'accueil de l'EJB nommé
- Une méthode spécifiée à l'intérieur d'un ensemble de méthodes avec un nom surchargé
17.4.2.2. Utilisation des permissions de méthodes EJB Copier lienLien copié sur presse-papiers!
L'élément <method-permission> définit les roles logiques qui peuvent accéder aux méthodes EJB définies par les éléments <method>. Un certain nombre d'exemples expliquent la syntaxe XML. Plusieurs énoncés de method-permission peuvent être présents, et avoir un effet cumulatif. L'élément <method-permission> est un dépendant de l'élément <assembly-descriptor> du descripteur <ejb-jar>.
Exemple 17.7. Permet aux rôles d'accéder à toutes les méthodes d'un EJB
Exemple 17.8. Permet aux rôles d'accéder uniquement à des méthodes spécifiques d'un EJB, et de déterminer quels paramètres de méthode peuvent être passés.
Exemple 17.9. Permet à n'importe quel utilisateur authentifié d'accéder aux méthodes des EJB
<unchecked/> permet à un utilisateur authentifié d'utiliser les méthodes spécifiées.
Exemple 17.10. Exclut totalement l'utilisation de certaines méthodes EJB
Exemple 17.11. Un <assembly-descriptor> complet contenant plusieurs blocs de <method-permission>
17.4.3. Annotations de sécurité EJB Copier lienLien copié sur presse-papiers!
17.4.3.1. Les annotations de sécurité EJB Copier lienLien copié sur presse-papiers!
javax.annotation.security sont définies dans JSR250.
- @DeclareRoles
- Déclare quels rôles sont disponibles.
- @RunAs
- Configure l'identification de sécurité propagée d'un composant.
17.4.3.2. Utilisation des annotations de sécurité EJB Copier lienLien copié sur presse-papiers!
Vous pouvez utiliser deux descripteurs XML ou des annotations pour contrôler quels rôles de sécurité sont en mesure d'appeler des méthodes dans votre Enterprise JavaBeans (EJB). Pour plus d'informations sur l'utilisation des descripteurs XML, reportez-vous à Section 17.4.2.2, « Utilisation des permissions de méthodes EJB ».
Annotations pour contrôler les permissions de sécurité des EJB
- @DeclareRoles
- Utiliser @DeclareRoles pour définir dans quels rôles vérifier les permissions. Si aucun @DeclareRoles n'est présent, la liste sera créée automatiquement avec l'annotation @RolesAllowed. Pour plus d'informations sur la configuration des rôles, voir Java EE 6 Tutorial Specifying Authorized Users by Declaring Security Roles.
- @RolesAllowed, @PermitAll, @DenyAll
- Utiliser
@RolesAllowedpour lister les rôles qui peuvent accéder à une méthode ou à des méthodes. Utiliser@PermitAllou@DenyAllpour autoriser ou empêcher à des rôles d'utiliser une méthode ou des méthodes. Pour plus d'informations sur la configuration des permissions de méthode d'annotation, consultez Java EE 6 Tutorial Specifying Authorized Users by Declaring Security Roles. - @RunAs
- Utiliser
@RunAspour spécifier un rôle utilisé par une méthode quand elle lance des appels à partir d'une méthode annotée. Pour plus d'informations sur la façon de configurer les identités de sécurité propagées par des annotations, voir Java EE 6 Tutorial Propagating a Security Identity (Run-As).
Exemple 17.12. Exemple d'annotations de sécurité
WelcomeEveryone. La méthode GoodBye exécute sous la forme du rôle tempemployee pour les appels. Seul le rôle admin peut accéder à la méthode GoodbyeAdmin, ou à toute autre méthode sans annotation de sécurité.
17.4.4. Accès à distance aux EJB Copier lienLien copié sur presse-papiers!
17.4.4.1. JBoss Remoting (accès à distance) Copier lienLien copié sur presse-papiers!
Types de services pris en charge
- Socket / Secure Socket
- RMI / RMI sur SSL
- HTTP / HTTPS
- Servlet / Secure Servlet
- Bisocket / Secure Bisocket
Avertissement
Le système Remoting d'accès distant fournit également des services de marshalling et unmarshalling de données. Le marshaling de données désigne la capacité de déplacer en toute sécurité des données au-delà des limites de réseau et de la plate-forme, afin qu'un système séparé puisse effectuer des tâches dessus. Le travail est ensuite renvoyé vers le système d'origine et se comporte comme s'il avait eu lieu localement.
Lorsque vous créez une application cliente qui utilise Remoting, vous indiquez à votre application de communiquer avec le serveur en la configurant pour qu'elle utilise un type spécial de localisateur de ressources appelé un InvokerLocator, qui est une chaîne simple avec un format de type URL. Le serveur écoute les requêtes des ressources distantes sur un connecteur, qui est configuré comme faisant partie du sous-système remoting. Le connecteur transmet la demande à un ServerInvocationHandler configuré. Chaque ServerInvocationHandler implémente une méthode invoke(InvocationRequest) qui sait comment gérer la demande.
Couches de framework JBoss Remoting
- L'utilisateur interagit avec la couche externe. Côté client, la couche externe est la classe
Client, qui envoie des requêtes d'invocation. Côté serveur, c'est InvocationHandler, mis en œuvre par l'utilisateur, qui reçoit des demandes d'invocation. - Le transport est contrôlé par la couche d'invocateur.
- La couche inférieure contient le marshaller et le unmarshaller, qui convertit les formats de données en formats de transmission.
17.4.4.2. Remoting Callbacks Copier lienLien copié sur presse-papiers!
InvocationRequest au client. Votre code côté serveur fonctionne de la même façon que le rappel soit synchrone ou asynchrone. Seul le client a besoin de connaître la différence. InvocationRequest du serveur envoie un responseObject au client. Il s'agit de la charge que le client a demandée. C'est peut-être une réponse directe à une demande ou à une notification d'événement.
m_listeners. Il contient une liste de tous les listeners qui ont été ajoutés à votre server handler. L'interface du ServerInvocationHandler inclut des méthodes qui vous permettent de gérer cette liste.
org.jboss.remoting.InvokerCallbackHandler, qui traite les données de callback. Après l'implémentation du gestionnaire de callbacks, soit vous vous ajoutez vous-même, en tant que listener de «pull callback», ou bien, vous installez un serveur de callbacks pour un «push callback».
Pour un «pull callback», votre client s'ajoute à la liste du serveur des listeners à l'aide de la méthode Client.addListener(). Ensuite, il interroge le serveur périodiquement au sujet de l'exécution synchrone des données de callback. Ce sondage est effectué à l'aide de Client.getCallbacks().
Un «push callback» requiert que votre application cliente exécute elle-même son propre InvocationHandler. Pour ce faire, vous devez exécuter un service Remoting sur le client lui-même. Ceci s'appelle un callback server. Le server de callbacks accepte les requêtes entrantes de façon asynchrone et les traite pour l'auteur de la demande (dans ce cas, le serveur). Pour inscrire le serveur de callbacks de votre client avec le serveur principal, passez l'argument InvokerLocator du serveur de callbacks comme deuxième argument à la méthode addListener.
17.4.4.3. Remoting Server Detection Copier lienLien copié sur presse-papiers!
17.4.4.4. Configurer le sous-système de JBoss Remoting Copier lienLien copié sur presse-papiers!
JBoss Remoting a trois éléments configurables de niveau supérieur : le pool de worker threads, un ou plusieurs connecteurs et une série de liens URI locaux et distants. Cette rubrique propose une explication pour chaque élément configurable, des exemples de commandes CLI pour savoir comment configurer chaque élément et un exemple XML d'un sous-système entièrement configuré. Cette configuration s'applique uniquement au serveur. La plupart des gens n'auront pas à configurer le sous-système de communication à distance, sauf s'ils utilisent des connecteurs personnalisés pour leurs propres applications. Les applications qui agissent comme des clients Remoting, comme les EJB, nécessitent une configuration distincte pour se connecter à un connecteur spécifique.
Note
Les commandes CLI sont formulées pour un domaine géré, lorsque vous configurez le profil par défaut. Pour configurer un profil différent, changez-en le nom. Pour un serveur autonome, omettre la section /profile=default de la commande.
Il y a un certain nombre d'aspects de configuration qui sont en dehors du sous-système remoting :
- Network Interface
- L'interface de réseau qui est utilisée par le sous-système
remotingest l'interfacepubliquedéfinie dansdomain/configuration/domain.xmlou dansstandalone/configuration/standalone.xml.Copy to Clipboard Copied! Toggle word wrap Toggle overflow La définition par-hôte de l'interfacepubliqueest définie danshost.xmldans le même répertoire quedomain.xmloustandalone.xml. Cette interface est également utilisée par plusieurs autres sous-systèmes. Soyez vigilants quand vous la modifierez.Copy to Clipboard Copied! Toggle word wrap Toggle overflow - socket-binding
- La liaison-socket par défaut utilisée par le sous-système
remotingse lie au port TCP 4447. Reportez-vous à la documentation sur les liaisons de socket et de groupes de liaisons de socket pour plus d'informations si vous avez besoin de procéder à une modification. - Remoting Connector Reference pour EJB
- Le sous-système EJB contient une référence vers le connecteur à distance pour les invocations de méthodes à distance. Voici la configuration par défaut :
<remote connector-ref="remoting-connector" thread-pool-name="default"/>
<remote connector-ref="remoting-connector" thread-pool-name="default"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Configuration du transport sécurisé
- Les transports à distance (Remoting) utilisent StartTLS pour avoir une connexion sécurisée (HTTPS, Secure Servlet, etc.) si le client le demande. La même liaison de socket (port réseau) est utilisée pour les connexions sécurisées et non sécurisées, donc aucune configuration côté serveur supplémentaire n'est nécessaire. Le client demande le transport sécurisé ou non sécurisé, tel que le dictent ses besoins. Les composants JBoss EAP 6 qui utilisent Remoting, tels que les fournisseur JMS, EJB et ORB exigent des interfaces sécurisées par défaut.
Avertissement
Un Worker Thread Pool est un ensemble de threads qui peuvent traiter les tâches qui arrivent par les connecteurs Remoting. Il s'agit d'un seul élément <worker-thread-pool>, et nécessite un certain nombre d'attributs. Régler ces attributs si vous avez des timeouts de réseau, ou si vous devez limiter l'utilisation de la mémoire. Les conseils varient suivant la situation dans laquelle vous vous trouvez. Contacter Red Hat Global Support Services pour obtenir davantage d'informations.
| Attribut | Description | CLI Command |
|---|---|---|
| read-threads |
Le nombre de read-threads à créer pour le worker à distance. La valeur par défaut est
1.
| /profile=default/subsystem=remoting/:write-attribute(name=worker-read-threads,value=1)
|
| write-threads |
Le nombre de write-threads à créer pour le worker à distance. La valeur par défaut est
1.
| /profile=default/subsystem=remoting/:write-attribute(name=worker-write-threads,value=1)
|
| task-keepalive |
Le nombre de millisecondes pour conserver les threads de tâche de workers à distance non-core vivants. La valeur par défaut est
60.
| /profile=default/subsystem=remoting/:write-attribute(name=worker-task-keepalive,value=60)
|
| task-max-threads |
Le nombre de maximum de threads pour le Worker Task Thread Pool distant. La valeur par défaut est
60.
| /profile=default/subsystem=remoting/:write-attribute(name=worker-task-max-threads,value=16)
|
| task-core-threads |
Le nombre de threads principaux pour le Worker Task Thread Pool distant. La valeur par défaut est
4.
| /profile=default/subsystem=remoting/:write-attribute(name=worker-task-core-threads,value=4)
|
| task-limit |
Le nombre de maximum de tâches de worker distantes. La valeur par défaut est
16384.
| /profile=default/subsystem=remoting/:write-attribute(name=worker-task-limit,value=16384)
|
Le connecteur est le principal élément de configuration de Remoting (d'accès à distance). Les connecteurs multiples sont autorisés. Chacun se compose d'un élément <connector> avec plusieurs sous-éléments, ainsi que quelques attributs possibles. Le connecteur par défaut est utilisé par plusieurs sous-systèmes de JBoss EAP 6. Des paramètres spécifiques pour les éléments et les attributs de vos connecteurs personnalisés dépendent de vos applications, donc contactez Red Hat Global Support Services pour plus d'informations.
| Attribut | Description | CLI Command |
|---|---|---|
| socket-binding | Le nom de la liaison de socket à utiliser pour ce connecteur. | /profile=default/subsystem=remoting/connector=remoting-connector/:write-attribute(name=socket-binding,value=remoting)
|
| authentication-provider |
Le module JASPIC (de l'anglais Java Authentication Service Provider Interface for Containers) à utiliser avec ce connecteur. Le module doit être dans le chemin de classes.
| /profile=default/subsystem=remoting/connector=remoting-connector/:write-attribute(name=authentication-provider,value=myProvider)
|
| security-realm |
En option. Le domaine de la sécurité qui contient les utilisateurs, mots de passe et les rôles de votre application. Un EJB ou une Application Web peut authentifier sur un domaine de sécurité.
ApplicationRealm est disponible dans une installation de JBoss EAP 6 par défaut.
| /profile=default/subsystem=remoting/connector=remoting-connector/:write-attribute(name=security-realm,value=ApplicationRealm)
|
| Attribut | Description | CLI Command |
|---|---|---|
| sasl |
Élément englobant des mécanismes d'authentification SASL (Simple Authentication and Security Layer)
| N/A
|
| propriétés |
Contient un ou plusieurs éléments
<property>, contenant chacun un attribut name et un attribut value optionnel.
| /profile=default/subsystem=remoting/connector=remoting-connector/property=myProp/:add(value=myPropValue)
|
Vous pouvez spécifier trois types différents d'attribut de connexion sortante :
- Connexion sortante vers un URI.
- Connexion sortante locale – se connectant à une ressource locale, comme un socket.
- Connexion sortante à distance – se connectant à une ressource à distance et s'authentifiant par l'intermédiaire d'un domaine de sécurité.
<outbound-connections>. Chacun de ces types de connexion prend un attribut outbound-socket-binding-ref. La connexion sortante prend un attribut uri. La connexion sortante prend les attributs facultatifs username (nom d'utilisateur) et security-realm (domaine de sécurité) pour l'autorisation.
| Attribut | Description | CLI Command |
|---|---|---|
| outbound-connection | Connexion sortante standard | /profile=default/subsystem=remoting/outbound-connection=my-connection/:add(uri=http://my-connection)
|
| local-outbound-connection | Connexion sortante en schéma implicite local:// URI. | /profile=default/subsystem=remoting/local-outbound-connection=my-connection/:add(outbound-socket-binding-ref=remoting2)
|
| remote-outbound-connection |
Connexion sortante en schéma remote:// URI, utilisant l'authentification de base/digest avec un domaine de sécurité.
| /profile=default/subsystem=remoting/remote-outbound-connection=my-connection/:add(outbound-socket-binding-ref=remoting,username=myUser,security-realm=ApplicationRealm)
|
Avant de définir des éléments enfants SASL, vous devez créer l'élément SASL initial. Utiliser la commande suivante :
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl:add
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl:add
| Attribut | Description | CLI Command |
|---|---|---|
| include-mechanisms |
Contient un attribut
value, qui correspond à une liste de mécanismes SASL.
|
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl:write-attribute(name=include-mechanisms,value=["DIGEST","PLAIN","GSSAPI"])
|
| qop |
Contient un attribut
value, qui correspond à une liste de valeurs de protection SASL, en ordre décroissant de préférence.
|
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl:write-attribute(name=qop,value=["auth"])
|
| puissance |
Contient un attribut
value, qui correspond à une liste de valeurs de puissance cipher SASL, en ordre décroissant de préférence.
|
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl:write-attribute(name=strength,value=["medium"])
|
| reuse-session |
Contient un attribut
value, qui correspond à une valeur booléenne. Si sur true, tente de réutiliser les sessions.
|
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl:write-attribute(name=reuse-session,value=false)
|
| server-auth |
Contient un attribut
value, qui correspond à une valeur booléenne. Si sur true, le serveur s'authentifie auprès du client.
|
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl:write-attribute(name=server-auth,value=false)
|
| politique |
Un élément clôturé qui contient zéro ou plusieurs des éléments suivants, prenant chacun une seule
valeur.
|
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl/sasl-policy=policy:add
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl/sasl-policy=policy:write-attribute(name=forward-secrecy,value=true)
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl/sasl-policy=policy:write-attribute(name=no-active,value=false)
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl/sasl-policy=policy:write-attribute(name=no-anonymous,value=false)
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl/sasl-policy=policy:write-attribute(name=no-dictionary,value=true)
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl/sasl-policy=policy:write-attribute(name=no-plain-text,value=false)
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl/sasl-policy=policy:write-attribute(name=pass-credentials,value=true)
|
| propriétés |
Contient un ou plusieurs éléments
<property>, contenant chacun un attribut name et un attribut value optionnel.
|
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl/property=myprop:add(value=1)
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl/property=myprop2:add(value=2)
|
Exemple 17.13. Exemples de configurations
<subsystem xmlns="urn:jboss:domain:remoting:1.1">
<connector name="remoting-connector" socket-binding="remoting" security-realm="ApplicationRealm"/>
</subsystem>
<subsystem xmlns="urn:jboss:domain:remoting:1.1">
<connector name="remoting-connector" socket-binding="remoting" security-realm="ApplicationRealm"/>
</subsystem>
Aspects de la configuration non encore documentés
- JNDI et Détection automatique multi diffusion
17.4.4.5. Utilisation des domaines de sécurité avec les clients EJB distants Copier lienLien copié sur presse-papiers!
- Ajoutez un nouveau domaine de sécurité au contrôleur de domaine ou au serveur autonome.
- Ajoutez les paramètres suivants au fichier
jboss-ejb-client.properties, qui est dans le chemin de classes de l'application. Cet exemple suppose que la connexion est appeléepar défautpar les autres paramètres qui se trouvent dans le fichier.remote.connection.default.username=appuser remote.connection.default.password=apppassword
remote.connection.default.username=appuser remote.connection.default.password=apppasswordCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Créez un connecteur Remoting personnalisé sur le domaine ou sur le serveur autonome qui utilise le nouveau domaine de sécurité.
- Déployez votre EJB dans le groupe de serveur configuré pour utiliser le profil avec le connecteur Remoting personnalisé, ou dans le serveur autonome si vous n'utilisez pas de domaine géré.
17.4.4.6. Ajout d'un domaine de sécurité Copier lienLien copié sur presse-papiers!
Exécuter l'interface CLI
Démarrez par la commandejboss-cli.shoujboss-cli.batet connectez-vous au serveur.Créer le nouveau domaine de sécurité lui-même.
Exécutez la commande suivante pour créer un nouveau domaine de sécurité nomméMyDomainRealmsur un contrôleur de domaine ou sur un serveur autonome.Pour une instance de domaine, utiliser la commande suivante :/host=master/core-service=management/security-realm=MyDomainRealm:add()
/host=master/core-service=management/security-realm=MyDomainRealm:add()Copy to Clipboard Copied! Toggle word wrap Toggle overflow Pour une instance autonome, utiliser la commande suivante :/core-service=management/security-realm=MyDomainRealm:add()
/core-service=management/security-realm=MyDomainRealm:add()Copy to Clipboard Copied! Toggle word wrap Toggle overflow Créer les références du fichier de propriétés qui stocke les informations sur le nouveau rôle.
Exécutez la commande suivante pour créer un pointeur au fichier nommémyfile.properties, qui contiendra les propriétés attachées au nouveau rôle.Note
Le fichier de propriétés nouvellement créées n'est pas géré par les scriptsadd-user.shetadd-user.batinclus. Il devra être administré en externe.Pour une instance de domaine, utiliser la commande suivante :/host=master/core-service=management/security-realm=MyDomainRealm/authentication=properties:add(path=myfile.properties)
/host=master/core-service=management/security-realm=MyDomainRealm/authentication=properties:add(path=myfile.properties)Copy to Clipboard Copied! Toggle word wrap Toggle overflow Pour une instance autonome, utiliser la commande suivante :/core-service=management/security-realm=MyDomainRealm/authentication=properties:add(path=myfile.properties)
/core-service=management/security-realm=MyDomainRealm/authentication=properties:add(path=myfile.properties)Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Votre nouveau domaine de sécurité sera créé. Lorsque vous ajoutez des utilisateurs et des rôles à ce nouveau domaine, l'information va être stockée dans un fichier séparé des domaines de sécurité par défaut. Vous pouvez gérer ce nouveau fichier à l'aide de vos propres applications ou procédures.
17.4.4.7. Ajout d'un utilisateur à un domaine de sécurité Copier lienLien copié sur presse-papiers!
Éxécuter la commande
add-user.shouadd-user.bat.Ouvrez un terminal (shell) et changez de répertoireEAP_HOME/bin/. Si vous exécutez Red Hat Enterprise Linux ou un autre système d'exploitation style UNIX, exécutezadd-user.sh. Si vous exécutez sur un serveur Microsoft Windows, exécutezadd-user.bat.Choisir d'ajouter un utilisateur de gestion ou un utilisateur d'application.
Pour cette procédure, saisirbpour ajouter un utilisateur d'application.Choisir le domaine dans lequel l'utilisateur sera ajouté.
Par défaut, le seul domaine disponible estApplicationRealm. Si vous avez ajouté un domaine personnalisé, vous pouvez saisir son nom à la place.Saisir le nom d'utilisateur, le mot de passe et les rôles lorsque vous y serez invité.
Saisir le nom d'utilisateur, le mot de passe et les rôles lorsque vous y serez invité. Vérifiez votre choix en tapantyes, ounopour annuler les changements. Les changements sont inscrits dans les fichiers de propriétés du domaine de sécurité.
17.4.4.8. Accès EJB à distance utilisant le cryptage SSL Copier lienLien copié sur presse-papiers!
Avertissement
17.5. Sécurité des applications JAX-RS Copier lienLien copié sur presse-papiers!
17.5.1. Activez la sécurité basée-rôle pour RESTEasy JAX-RS Web Service Copier lienLien copié sur presse-papiers!
RESTEasy supporte les annotations @RolesAllowed, @PermitAll, et @DenyAll sur les méthodes JAX-RS. Cependant, il ne reconnaît pas ces annotations par défaut. Suivre les étapes suivantes pour configurer le fichier web.xml et pour activer la sécurité basée-rôle.
Avertissement
Procédure 17.3. Activez la sécurité basée-rôle pour RESTEasy JAX-RS Web Service
- Ouvrir le fichier
web.xmlde l'application dans un éditeur de texte. - Ajoutez le <context-param> suivant au fichier, dans les balises
web-app:<context-param> <param-name>resteasy.role.based.security</param-name> <param-value>true</param-value> </context-param><context-param> <param-name>resteasy.role.based.security</param-name> <param-value>true</param-value> </context-param>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Déclarez tous les rôles utilisés dans le fichier RESTEasy JAX-RS WAR file, en utilisant les balises de <security-role> :
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Autorisez l'accès à tous les URL gérés par le runtime JAX-RS pour tous les rôles :
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
La sécurité basée rôle à été activée dans l'application, avec un certain nombre de rôles définis.
Exemple 17.14. Exemple de configuration de sécurité basée rôles
17.5.2. Sécuriser un service JAX-RS Web par des annotations Copier lienLien copié sur presse-papiers!
Cette rubrique couvre les étapes à parcourir pour sécuriser un service JAX-RS Web par les annotations de sécurité supportées.
Procédure 17.4. Sécuriser un service JAX-RS Web par des annotations de sécurité supportées.
- Activez la sécurité basée-rôle. Pour plus d'informations, voir Section 17.5.1, « Activez la sécurité basée-rôle pour RESTEasy JAX-RS Web Service ».
- Ajoutez des annotations de sécurité au service JAX-RS Web. RESTEasy supporte les annotations suivantes :
- @RolesAllowed
- Définit les rôles qui peuvent accéder à la méthode. Tous les rôles doivent être définis dans le fichier
web.xml. - @PermitAll
- Autorise tous les rôles définis dans le fichier
web.xmlà accéder à la méthode. - @DenyAll
- Refuse tout accès à la méthode.
17.6. Protocole mots de passes distants sécurisés Copier lienLien copié sur presse-papiers!
17.6.1. Protocole pour mots de passes distants sécurisés (SRP pour Secure Remote Password) Copier lienLien copié sur presse-papiers!
Ce document décrit un mécanisme d'authentification de réseau à cryptage puissant connu comme le nom de protocole SRP (Secure Remote Password). Ce mécanisme est approprié pour négocier des connexions sécurisées avec un mot de passe fourni par l'utilisateur, tout en éliminant les problèmes de sécurité traditionnellement associés à des mots de passe réutilisables. Ce système effectue également un échange de clés sécurisée dans le processus d'authentification, ce qui permet à ce que des couches de sécurité (protection de la vie privée et/ou de l'intégrité) soient activées lors de la session. Il n'est nul besoin de serveurs de clés de confiance ou d'infrastructures de certificats, et les clients ne sont pas tenus de stocker ou de gérer des clés à long terme. SRP offre des avantages tant au niveau de la sécurité qu'au niveau déploiement sur les techniques existantes de stimulation / réponse, ce qui en fait un remplacement idéal pour les besoins d'authentification de mots de passe sécurisés.
17.6.2. Configuration du protocole SRP (Secure Remote Password) Copier lienLien copié sur presse-papiers!
SRPVerifierStore. Vous trouverez des informations sur l'implémentation à Implémentation SRPVerifierStore.
Procédure 17.5. Intégrer le store de mots de passe existant
Créer un store d'informations de mots de passe hachés.
Si vos mots de passe sont déjà stockés sous une forme hachée irréversible, vous aurez besoin de faire cela sur la base utilisateur.Vous pouvez implémenter unsetUserVerifier(String, VerifierInfo)en tant que méthode noOp, ou d'une méthode qui envoie une exception signifiant que le store est en lecture-seule.Créer l'interface SRPVerifierStore.
Créer une implémentation d'interfaceSRPVerifierStorepersonnalisée qui puisse obtenirVerifierInfodu store que vous avez créé.LeverifyUserChallenge(String, Object)peut servir à intégrer des schémas basés token de matériel existant comme SafeWord ou Radius dans l'algorithme SRP. Cette méthode d'interface est appelée uniquement lorsque la configuration SRPLoginModule du client spécifie l'option hasAuxChallenge.Créer le MBean JNDI.
Créer un MBean qui expose l'interfaceSRPVerifierStoredisponible à JNDI, et expose tous les paramètres configurables requis.Le serviceorg.jboss.security.srp.SRPVerifierStoreServicepar défaut vous permet d'implémenter ceci. Vous pouvez également implémenter le MBean par une implémentation de fichier de propriétés Java duSRPVerifierStore.
L'implémentation par défaut de l'interface SRPVerifierStore n'est pas recommandée pour les systèmes de production, car elle exige que toutes les informations de hachage de mot de passe soient disponibles sous forme de fichier d'objets sérialisés.
SRPVerifierStore fournit un accès à l'objet SRPVerifierStore.VerifierInfo pour un nom d'utilisateur donné. La méthode getUserVerifier(String) est appelée par le SRPService au départ d'une session SRP utilisateur pour obtenir les paramètres requis par l'algorithme SRP.
Éléments d'un Objet VerifierInfo
- nom d'utilisateur
- Le nom d'utilisateur ou l'ID utilisateur pour s'authentifier
- verifier
- Un hachage unidirectionnel du mot de passe que l'utilisateur saisit comme preuve d'identité. La classe
org.jboss.security.Utilinclut une méthodecalculateVerifierqui exécute l'algorithme de hachage de mot de passe. Le mot de passe de sortie prend la formeH(salt | H(username | password)), oùHest la fonction de hachage sécurisée SHA, telle que définie par RFC2945. Le nom d'utilisateur est converti d'une chaîne en un byte [] en utilisant le codage UTF-8. - salt
- Un nombre aléatoire utilisé pour augmenter la difficulté d'une attaque de force brute de dictionnaire sur la base de données de mot de passe de vérification au cas où la base de données soit compromise. La valeur doit être générée à partir d'un algorithme de cryptage fort composé de nombres aléatoires lorsque le mot de passe en texte clair existant de l'utilisateur est haché.
- g
- Le générateur primitif d'algorithme SRP. Cela peut être un paramètre fixe bien connu plutôt qu'un paramètre par utilisateur. La classe d'utilitaire de
org.jboss.security.srp.SRPConffournit plusieurs paramètres pourg, avec une valeur par défaut appropriée obtenue par l'intermédiaire deSRPConf.getDefaultParams().g(). - N
- SRP algorithm safe-prime modulus. Cela peut être un paramètre fixe bien connu, plutôt qu'un paramètre par utilisateur. La classe d'utilitaire de
org.jboss.security.srp.SRPConffournit plusieurs paramètres pour «N», y compris un bon nombre de valeurs par défaut obtenues viaSRPConf.getDefaultParams().N().
Exemple 17.15. L'interface SRPVerifierStore
17.7. L'archivage sécurisé des mots de passe pour les strings de nature confidentielle Copier lienLien copié sur presse-papiers!
17.7.1. Système d'archivage sécurisé de mots de passe Copier lienLien copié sur presse-papiers!
17.7.2. Configurer et utiliser l'archivage sécurisé des mots de passe Copier lienLien copié sur presse-papiers!
Procédure 17.6. Étapes de base pour configurer et utiliser l'archivage sécurisé des mots de passe
- Installation d'un Java Keystore pour stocker des clés pour le cryptage de mots de passe.Pour plus d'informations sur la création d'un keystore, veuillez consulter Section 17.7.4, « Créer un keystore Java pour stocker des strings sensibles ».
- Initialiser l'archivage sécurisé des mots de passePour savoir comment masquer le mot de passe et initialiser la valeur de mot de passe, veuillez consulter Section 17.7.5, « Initialiser le Password Vault ».
- Configurer JBoss EAP pour qu'il utilise l'archivage sécurisé des mots de passePour obtenir des informations sur la façon de configurer EAP 6 afin qu'il puisse utiliser le Password Vault, voir Section 17.7.6, « Configurer JBoss EAP pour qu'il utilise l'archivage sécurisé des mots de passe ».
- Stocker une chaîne sensible dans l'archivage sécurisé des mots de passe.Pour obtenir des informations sur la façon de stocker une chaîne sensible dans le Password Vault, voir Section 17.7.8, « Stocker une chaîne sensible dans l'archivage sécurisé des mots de passe ».
- Configurer JBoss EAP pour qu'il utilise l'archivage sécurisé des mots de passePour obtenir des informations sur la façon de configurer EAP 6 afin qu'il puisse utiliser le Password Vault, voir Section 17.7.6, « Configurer JBoss EAP pour qu'il utilise l'archivage sécurisé des mots de passe ». Pour un implémentation personnalisée, voir Section 17.7.7, « Configurer JBoss EAP pour qu'il utilise une implémentation d'archivage sécurisé personnalisée ».
Note
Pour obtenir des informations sur la façon de chiffrer une chaîne sensible, voir Section 17.7.9, « Utiliser un string sensible crypté dans Configuration. ».Pour obtenir des informations sur la façon d'utiliser une chaîne sensible chiffrée, voir Section 17.7.10, « Utiliser un string sensible crypté dans une Application ».Pour vérifier une chaîne sensible dans le Password Vault, voir Section 17.7.11, « Vérifiez si une chaîne sensible se situe dans l'archivage sécurisé des mots de passe ».Pour supprimer une chaîne sensible du Password Vault, voir Section 17.7.12, « Supprimer une chaîne sensible de l'archivage sécurisé des mots de passe ».
17.7.3. Obtenez le mot de passe Keystore d'une source externe Copier lienLien copié sur presse-papiers!
<vault-option name="KEYSTORE_PASSWORD" value="[here]"
<vault-option name="KEYSTORE_PASSWORD" value="[here]"
{EXT}...: fait référence à la commande exacte pour laquelle ‘…’ est la commande exacte. Exemmple :{EXT}/usr/bin/getmypassword --section 1 --query company, exécutez la commande/usr/bin/getmypasswordqui affiche le mot de passe ou la sortie standard, et l'utilise comme mot de passe pour le keystore de l'archivage sécurisé. Dans cet exemple, la commande utilise deux options : --section 1 et --query company.{EXTC[:expiration_in_millis]}...: fait référence à la commande exacte pour laquelle '...' est la ligne de commande précise qui est passée à la méthode Runtime.exec(String) pour exécuter une commande de plateforme. La première ligne de la sortie de commande est utilisée comme mot de passe. La variante EXTC met en cache les mots de passe pour expiration_in_millis milliseconds. L'expiration du cache par défaut est 0 (zéro), ce qui signifie que les éléments mis en cache n'expirent jamais. Exemple :{EXTC:120000}/usr/bin/getmypassword --section 1 --query companyvérifie si le cache contient une sortie/usr/bin/getmypassword, et s'il contient la sortie, alors utilisez-la. S'il ne contient pas de sortie, exécutez la commande pour la faire aller dans le cache, et utilisez-la. Dans cet exemple, le cache expire dans 2 minutes (120000 millisecondes).{CMD}...ou{CMDC[:expiration_in_millis]}...: la commande générale est une chaîne délimitée par ',' où la première partie correspond à la commande et le reste correspond aux paramètres. La virgule peut être à la place une barre oblique de retour pour demeurrer dans le paramètre. Exemple,{CMD}/usr/bin/getmypassword,--section,1,--query,company{CLASS[@jboss_module_spec]}classname[:ctorargs]où [:ctorargs] est une chaîne optionnelle délimitée par ':' du nom de classe qui va être passé au nom de classe ctor. Le ctorargs lui-même correspond à une liste de chaînes délimitées par des virgules. Exemple,{CLASS@org.test.passwd}org.test.passwd.ExternamPassworProvider. Dans cet exemple, nous chargeons la classeorg.test.passwd.ExternamPassworProviderdu moduleorg.test.passwdet on utilise la méthodetoCharArray()pour obtenir le mot de passe. SitoCharArray()n'est pas disponible, utiliser la méthodetoString(). La classeorg.test.passwd.ExternamPassworProviderdoit posséder le constructeur par défaut.
17.7.4. Créer un keystore Java pour stocker des strings sensibles Copier lienLien copié sur presse-papiers!
Conditions préalables
- La commande
keytoolfournie par le Java Runtime Environment (JRE). Chercher le chemin du fichier qui se trouve à l'emplacement suivant/usr/bin/keytooldans Red Hat Enterprise Linux.
Avertissement
keytool à l'aide du même fournisseur que le JDK que vous utilisez.
keytool de JDK d'un fournisseur dans une instance JBoss EAP exécutant dans un JDK provenant d'un fournisseur différent, vous aurez l'exception suivante :
java.io.IOException: com.sun.crypto.provider.SealedObjectForKeyProtector
java.io.IOException: com.sun.crypto.provider.SealedObjectForKeyProtector
Procédure 17.7. Installation d'un Java keystore
Créez un répertoire pour stocker votre keystore et autres informations cryptées.
Créez un répertoire qui contiendra votre keystore et d'autres informations pertinentes. Le reste de cette procédure assume que le répertoire estEAP_HOME/vault/. Comme le répertoire devra contenir des informations sensibles, il devra être accessible à un nombre restraint d'utilisateurs. Le compte d'utilisateur sous lequel JBoss EAP exécute requiert au minimum un accès en lecture-écriture.Déterminer les paramètres à utiliser avec la commande
keytool.Choisissez les valeurs des paramètres suivants :- alias
- L'alias est un identificateur unique pour l'archivage sécurisé ou autres données stockées dans le keystore. Les alias sont insensibles à la casse.
- storetype
- Le storetype indique le type de keystore. La valeur
jceksest conseillée. - keyalg
- L'algorithme à utiliser pour le cryptage. Consultez la documentation de votre JRE et de votre système d'exploitation pour étudier vos possibilités.
- keysize
- La taille d'une clé de cryptage impacte sur la difficulté de décrypter au seul moyen de la force brutale. Pour plus d'informations sur les valeurs appropriées, voir la documentation distribuée avec
keytool. - storepass
- La valeur de
storepassest le mot de passe utilisé pour authentifier le keystore, et pour que la clé puisse être lue. Le mot de passe doit contenir au moins 6 caractères de long et doit être fourni quand on accède au keystore. Si vous omettez ce paramètre, on vous demandera de le saisir quand vous exécuterez la commande. - keypass
- La valeur de
keypassest le mot de passe utilisé pour accéder à la clé spécifique et doit correspondre à la valeur du paramètrestorepass. - validité
- La valeur de
validitéest la durée (en jours) pendant laquelle la clé sera valide. - keystore
- La valeur du
keystorecorrespond au chemin et nom du fichier dans lequel sont stockés les valeurs du keystore. Le fichier de clés est créé lorsque les données y sont ajoutées.Assurez-vous d'utiliser le séparateur de chemin d’accès correct du fichier:/(barre oblique inverse) pour Red Hat Enterprise Linux et systèmes d'exploitation similaires, et\pour les serveurs Microsoft Windows.
La commandekeytoola plusieurs options. Consultez la documentation de votre JRE ou de votre système d'exploitation pour obtenir plus d'informations.Exécuter la commande
keytoolLancer votre interface de ligne de commandes de votre système d'exploitation et exécuter la commandekeytool, en fournissant les informations que vous avez collectées.
Exemple 17.16. Créer un Java keystore
keytool -genseckey -alias vault -storetype jceks -keyalg AES -keysize 128 -storepass vault22 -keypass vault22 -validity 730 -keystore EAP_HOME/vault/vault.keystore
$ keytool -genseckey -alias vault -storetype jceks -keyalg AES -keysize 128 -storepass vault22 -keypass vault22 -validity 730 -keystore EAP_HOME/vault/vault.keystore
Un keystore aura été créé dans le fichier EAP_HOME/vault/vault.keystore. Il stocke une clé unique, dans l'archivage sécurisé alias, qui sera utilisé pour stocker les strings cryptés, comme les mots de passe, dans JBoss EAP.
17.7.5. Initialiser le Password Vault Copier lienLien copié sur presse-papiers!
Conditions préalables
Le Password Vault peut être initialisé de manière interactive, avec une invite pour la valeur de chaque paramètre, ou de manière non-interactive, où vous fournissez les valeurs de tous les paramètres sur la ligne de commande. Chaque méthode donne le même résultat, vous pouvez donc choisir la méthode qui vous convient.
- URL du keystore (KEYSTORE_URL)
- Le chemin d'accès ou URI du fichier keystore. Les exemples utilisent
EAP_HOME/vault/.vault.keystore - Mot de passe du keystore (KEYSTORE_PASSWORD)
- Le mot de passe utilisé pour accéder au keystore.
- Salt (SALT)
- La valeur de
saltcorrespond soit à une chaîne de huit caractères au hasard, utilisés avec le nombre d'itérations, pour chiffrer le contenu du keystore. - Alias de keystore Alias (KEYSTORE_ALIAS)
- L'alias sous lequel le keystore est connu.
- Nombre d'itérations (ITERATION_COUNT)
- Le nombre de fois que l'algorithme de chiffrement est exécuté.
- Fichiers de chiffrement du répertoire au store (ENC_FILE_DIR)
- Le chemin où les fichiers chiffrés sont stockés. Normalement, le répertoire contient l'archivage des mots de passe sécurisés.Il est pratique mais non pas obligatoire de stocker toutes vos informations de chiffrement au même endroit dans le keystore. Ce répertoire doit être accessible à des utilisateurs limités uniquement. Au minimum, le compte d'utilisateur sous lequel JBoss EAP exécute requiert un accès lecture-écriture. Si vous avez suivi Section 17.7.4, « Créer un keystore Java pour stocker des strings sensibles », votre keystore se trouvera dans le répertoire nommé
EAP_HOME/vault/.Note
La barre oblique inverse finale ou oblique sur le nom du répertoire est nécessaire. Assurez-vous d'utiliser le séparateur de chemin d’accès correct du fichier: / (forward slash) for Red Hat Enterprise Linux and similar operating systems, \ (backslash) pour les serveurs Microsoft Windows. - Vault Block (VAULT_BLOCK)
- Nom donné à ce bloc dans l'archivage sécurisé des mots de passes. Choisissez une valeur qui signifie quelquechose pour vous.
- Attribut (ATTRIBUTE)
- Nom donné à l'attribut stocké. Choisissez une valeur qui signifie quelquechose pour vous. Par exemple, vous pouvez choisir un nom que vous associez à une source de données.
- Attribut de Sécurité (SEC-ATTR)
- Le mot de passe qui est stocké dans l'archivage sécurisé de mots de passe.
Procédure 17.8. Exécutez la commande d'archivage sécurisé des mots de passe de façon interactive
Exécutez la commande d'archivage sécurisé des mots de passe de façon interactive
Lancez l'interface en ligne de commande de votre système d'exploitation et exécutezEAP_HOME/bin/vault.sh(sur Red Hat Enterprise Linux et systèmes d'exploitation similaires) ouEAP_HOME\bin\vault.bat(sur Microsoft Windows Server). Démarrez une nouvelle session interactive en tapant0(zéro).Complétez les paramètres à l'invite.
Suivez les instructions pour saisir les paramètres qui conviennent.Notez les informations de mot de passe masqué.
Le mot de passe masqué, salt, et le nombre d'itérations sont imprimés en sortie standard. Prenez-en note dans un endroit sûr. Ils sont requis pour ajouter des entrées dans l'archivage sécurisé. Si vous donnez accès au fichier de keystore, ses valeurs permettraient à un assailant d'accéder à des informations sensibles dans l'archivage sécurisé.Sortir de la console interactive.
Saisir3(trois) pour sortir de la console interactive.
Exemple 17.17. Exécutez la commande d'archivage sécurisé des mots de passe de façon interactive
Procédure 17.9. Exécutez la commande d'archivage sécurisé des mots de passe de façon non interactive
- Lancez l'interface en ligne de commande de votre système d'exploitation et exécutez la commande d'archivage sécurisé des mots de passe. Consultez la liste dans Aperçu général, et substituez les valeurs réservées par vos valeurs préférées.Utilisez
EAP_HOME/bin/vault.sh(sur Red Hat Enterprise Linux et systèmes d'exploitation similaires) ouEAP_HOME\bin\vault.bat(sur Microsoft Windows Server).vault.sh --keystore KEYSTORE_URL --keystore-password KEYSTORE_PASSWORD --alias KEYSTORE_ALIAS --vault-block VAULT_BLOCK --attribute ATTRIBUTE --sec-attr SEC-ATTR --enc-dir ENC_FILE_DIR --iteration ITERATION_COUNT --salt SALT
vault.sh --keystore KEYSTORE_URL --keystore-password KEYSTORE_PASSWORD --alias KEYSTORE_ALIAS --vault-block VAULT_BLOCK --attribute ATTRIBUTE --sec-attr SEC-ATTR --enc-dir ENC_FILE_DIR --iteration ITERATION_COUNT --salt SALTCopy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple 17.18. Exécutez la commande d'archivage sécurisé des mots de passe de façon non interactive
vault.sh --keystore EAP_HOME/vault/vault.keystore --keystore-password vault22 --alias vault --vault-block vb --attribute password --sec-attr 0penS3sam3 --enc-dir EAP_HOME/vault/ --iteration 120 --salt 1234abcd
vault.sh --keystore EAP_HOME/vault/vault.keystore --keystore-password vault22 --alias vault --vault-block vb --attribute password --sec-attr 0penS3sam3 --enc-dir EAP_HOME/vault/ --iteration 120 --salt 1234abcdCopy to Clipboard Copied! Toggle word wrap Toggle overflow Sortie de commandeCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Votre mot de passe de keystore est masqué afin de pouvoir être utilisé dans les fichiers de configuration et de déploiement. De plus, votre archivage de sécurité est initialisé et prêt à l'utilisation.
17.7.6. Configurer JBoss EAP pour qu'il utilise l'archivage sécurisé des mots de passe Copier lienLien copié sur presse-papiers!
Avant de masquer les mots de passe et d'autres attributs sensibles dans les fichiers de configuration, vous devez sensibiliser JBoss EAP 6 à l'archivage sécurisé des mots de passe qui les stocke et les déchiffre.
Conditions préalables
Procédure 17.10. Activer le Password Vault
- Exécutez la commande suivante de gestion CLI, en substituant les valeurs d’espace réservé par celles de la sortie de la commande du Password Vault Section 17.7.5, « Initialiser le Password Vault ».
Note
Si vous utilisez Microsoft Windows Server, mettes deux caractères\\dans le chemin d'accès au lieu d'un seul. Par exemple,C:\\data\\vault\\vault.keystore. C'est parce qu'un simple caractère\est utilisé comme caractère d'échappement./core-service=vault:add(vault-options=[("KEYSTORE_URL" => "PATH_TO_KEYSTORE"), ("KEYSTORE_PASSWORD" => "MASKED_PASSWORD"), ("KEYSTORE_ALIAS" => "ALIAS"), ("SALT" => "SALT"),("ITERATION_COUNT" => "ITERATION_COUNT"), ("ENC_FILE_DIR" => "ENC_FILE_DIR")])/core-service=vault:add(vault-options=[("KEYSTORE_URL" => "PATH_TO_KEYSTORE"), ("KEYSTORE_PASSWORD" => "MASKED_PASSWORD"), ("KEYSTORE_ALIAS" => "ALIAS"), ("SALT" => "SALT"),("ITERATION_COUNT" => "ITERATION_COUNT"), ("ENC_FILE_DIR" => "ENC_FILE_DIR")])Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Exemple 17.19. Activer le Password Vault
/core-service=vault:add(vault-options=[("KEYSTORE_URL" => "EAP_HOME/vault/vault.keystore"), ("KEYSTORE_PASSWORD" => "MASK-5dOaAVafCSd"), ("KEYSTORE_ALIAS" => "vault"), ("SALT" => "1234abcd"),("ITERATION_COUNT" => "120"), ("ENC_FILE_DIR" => "EAP_HOME/vault/")])
/core-service=vault:add(vault-options=[("KEYSTORE_URL" => "EAP_HOME/vault/vault.keystore"), ("KEYSTORE_PASSWORD" => "MASK-5dOaAVafCSd"), ("KEYSTORE_ALIAS" => "vault"), ("SALT" => "1234abcd"),("ITERATION_COUNT" => "120"), ("ENC_FILE_DIR" => "EAP_HOME/vault/")])
JBoss EAP 6 est configuré pour décrypter les strings masqués par l'intermédiaire de l'archivage sécurisé de mots de passe. Pour ajouter des strings à l'archivage sécurisé et les utiliser dans votre configuration, voir la section : Section 17.7.8, « Stocker une chaîne sensible dans l'archivage sécurisé des mots de passe ».
17.7.7. Configurer JBoss EAP pour qu'il utilise une implémentation d'archivage sécurisé personnalisée Copier lienLien copié sur presse-papiers!
Vous pouvez utiliser votre propre implémentation de SecurityVault pour masquer les mots de passe, et les autres attributs sensibles dans les fichiers de configuration.
Conditions préalables
Procédure 17.11. Utilisez une implémentation sécurisée de l'archivage des mots de passe
- Créez une classe qui implémente l'interface
SecurityVault. - Créez un module contenant la classe de l'étape précédente, et spécifiez une dépendance sur
org.picketboxoù l'interface estSecurityVault. - Activez l'archivage de mots de passe sécurisée dans la configuration du serveur JBoss EAP en ajoutant l'élément d'archivage à l'aide des attributs suivants :
- code
- La nom complet de la classe qui implémente
SecurityVault. - module
- Le nom du module qui contient la classe personnalisée.
Vous pouvez également utiliser les paramètresvault-optionspour initialiser la classe personnalisée d'un archivage de mots de passe.Exemple 17.20. Utilisez les paramètres
vault-optionspour initialiser la classe personnalisée/core-service=vault:add(code="custom.vault.implementation.CustomSecurityVault", module="custom.vault.module", vault-options=[("KEYSTORE_URL" => "PATH_TO_KEYSTORE"), ("KEYSTORE_PASSWORD" => "MASKED_PASSWORD"), ("KEYSTORE_ALIAS" => "ALIAS"), ("SALT" => "SALT"),("ITERATION_COUNT" => "ITERATION_COUNT"), ("ENC_FILE_DIR" => "ENC_FILE_DIR")])/core-service=vault:add(code="custom.vault.implementation.CustomSecurityVault", module="custom.vault.module", vault-options=[("KEYSTORE_URL" => "PATH_TO_KEYSTORE"), ("KEYSTORE_PASSWORD" => "MASKED_PASSWORD"), ("KEYSTORE_ALIAS" => "ALIAS"), ("SALT" => "SALT"),("ITERATION_COUNT" => "ITERATION_COUNT"), ("ENC_FILE_DIR" => "ENC_FILE_DIR")])Copy to Clipboard Copied! Toggle word wrap Toggle overflow
JBoss EAP 6 est configuré pour décrypter les chaînes masquées par l'intermédiaire d'une implémentation personnalisée de l'archivage des mots de passe.
17.7.8. Stocker une chaîne sensible dans l'archivage sécurisé des mots de passe Copier lienLien copié sur presse-papiers!
Inclure les mots de passe et autres strings sensibles dans les fichiers de configuration en texte brut est un risque pour la sécurité. Stocker ces chaînes à la place dans le Password Vault pour améliorer la sécurité, où il peuvent être référencés dans les fichiers de configuration, commandes CLI Management et applications sous leur forme masquée.
Conditions préalables
Procédure 17.12. Stocker une chaîne sensible de manière interactive
Exécutez la commande d'archivage sécurisé des mots de passe
Lancez l'interface en ligne de commande de votre système d'exploitation et exécutez la commande d'archivage sécurisé des mots de passe. UtilisezEAP_HOME/bin/vault.sh(sur Red Hat Enterprise Linux et systèmes d'exploitation similaires) ouEAP_HOME\bin\vault.bat(sur Microsoft Windows Server). Démarrez une nouvelle session interactive en tapant0(zéro).Complétez les paramètres de l'archivage sécurisé des mots de passe à l'invite.
Veuillez saisir les paramètres d'authentification nécessaires à l'invite. Ces valeurs doivent correspondre à celles indiquées lors de la création de l'archivage sécurisé des mots de passe.Note
Le mot de passe du keystore doit être fourni au format texte brut et non pas au format caché.Complétez les paramètres de l'archivage sécurisé des paramètres à l'invite.
Saisir0(zéro) pour commencer à stocker le string sensible. Suivez les instructions pour saisir les paramètres qui conviennent.Notez les informations pour ce string masqué.
Un message s'affiche sur la sortie standard, montrant le bloc d'archivage sécurisé, le nom de l'attribut, le string masqué, et des conseils sur l'utilisation du string dans votre configuration. Prendre note de ces informations dans un emplacement sécurisé. Voici un exemple de sortie.Vault Block:ds_Example1 Attribute Name:password Configuration should be done as follows: VAULT::ds_Example1::password::1
Vault Block:ds_Example1 Attribute Name:password Configuration should be done as follows: VAULT::ds_Example1::password::1Copy to Clipboard Copied! Toggle word wrap Toggle overflow Sortir de la console interactive
Saisir3(trois) pour sortir de la console interactive.
Exemple 17.21. Stocker une chaîne sensible de manière interactive
Procédure 17.13. Stocker une chaîne sensible de manière non interactive
- Lancez l'interface en ligne de commande de votre système d'exploitation et exécutez la commande d'archivage sécurisé des mots de passe. Utilisez
EAP_HOME/bin/vault.sh(sur Red Hat Enterprise Linux et systèmes d'exploitation similaires) ouEAP_HOME\bin\vault.bat(sur Microsoft Windows Server).Remplacez les espaces réservés par vos propres valeurs. Les valeurs des paramètresKEYSTORE_URL,KEYSTORE_PASSWORDetKEYSTORE_ALIASdoivent correspondre à celles fournies lors de la création de l'archivage sécurisé des mots de passe.Note
Le mot de passe du keystore doit être fourni au format texte brut et non pas au format caché.EAP_HOME/bin/vault.sh --keystore KEYSTORE_URL --keystore-password KEYSTORE_PASSWORD --alias KEYSTORE_ALIAS --vault-block VAULT_BLOCK --attribute ATTRIBUTE --sec-attr SEC-ATTR --enc-dir ENC_FILE_DIR --iteration ITERATION_COUNT --salt SALT
EAP_HOME/bin/vault.sh --keystore KEYSTORE_URL --keystore-password KEYSTORE_PASSWORD --alias KEYSTORE_ALIAS --vault-block VAULT_BLOCK --attribute ATTRIBUTE --sec-attr SEC-ATTR --enc-dir ENC_FILE_DIR --iteration ITERATION_COUNT --salt SALTCopy to Clipboard Copied! Toggle word wrap Toggle overflow Notez les informations pour ce string masqué.
Un message s'affiche sur la sortie standard, montrant le bloc d'archivage sécurisé, le nom de l'attribut, le string masqué, et des conseils sur l'utilisation du string dans votre configuration. Prendre note de ces informations dans un emplacement sécurisé. Voici un exemple de sortie.Vault Block:vb Attribute Name:password Configuration should be done as follows: VAULT::vb::password::1
Vault Block:vb Attribute Name:password Configuration should be done as follows: VAULT::vb::password::1Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Exemple 17.22. Exécutez la commande d'archivage sécurisé des mots de passe de façon non interactive
EAP_HOME/bin/vault.sh --keystore EAP_HOME/vault/vault.keystore --keystore-password vault22 --alias vault --vault-block vb --attribute password --sec-attr 0penS3sam3 --enc-dir EAP_HOME/vault/ --iteration 120 --salt 1234abcd
EAP_HOME/bin/vault.sh --keystore EAP_HOME/vault/vault.keystore --keystore-password vault22 --alias vault --vault-block vb --attribute password --sec-attr 0penS3sam3 --enc-dir EAP_HOME/vault/ --iteration 120 --salt 1234abcd
Ces chaînes sensibles sont maintenant stockées dans le Password Vault où il peuvent être référencés dans les fichiers de configuration, commandes CLI Management et applications sous leur forme masquée.
17.7.9. Utiliser un string sensible crypté dans Configuration. Copier lienLien copié sur presse-papiers!
Conditions préalables
Note
/host=HOST_NAME à la commande si vous devez appliquer les changements à un domaine géré.
/core-service=SUBSYSTEM:read-resource-description(recursive=true)
/core-service=SUBSYSTEM:read-resource-description(recursive=true)
Exemple 17.23. Énumérer la description de toutes les ressources dans le sous-système de gestion
/core-service=management:read-resource-description(recursive=true)
/core-service=management:read-resource-description(recursive=true)
expressions-allowed. Si la valeur est true, vous pouvez alors utiliser des expressions dans la configuration de ce sous-système.
${VAULT::VAULT_BLOCK::ATTRIBUTE_NAME::MASKED_STRING}
${VAULT::VAULT_BLOCK::ATTRIBUTE_NAME::MASKED_STRING}
Exemple 17.24. Définition de Datasource à l'aide d'un mot de passe masqué
ds_ExampleDS et l'attribut est password.
17.7.10. Utiliser un string sensible crypté dans une Application Copier lienLien copié sur presse-papiers!
Conditions préalables
Exemple 17.25. Servlet qui utilise un mot de passe d'archivage sécurisé.
17.7.11. Vérifiez si une chaîne sensible se situe dans l'archivage sécurisé des mots de passe Copier lienLien copié sur presse-papiers!
Avant de tenter de stocker ou utiliser une chaîne sensible dans l'archivage sécurisé des mots de passe, il peut être utile de confirmer si celle-ci est déjà stockée.
Procédure 17.14. Vérifier une chaîne sensible de manière interactive
Exécutez la commande d'archivage sécurisé des mots de passe
Lancez l'interface en ligne de commande de votre système d'exploitation et exécutez la commande d'archivage sécurisé des mots de passe. UtilisezEAP_HOME/bin/vault.sh(sur Red Hat Enterprise Linux et systèmes d'exploitation similaires) ouEAP_HOME\bin\vault.bat(sur Microsoft Windows Server). Démarrez une nouvelle session interactive en tapant0(zéro).Complétez les paramètres de l'archivage sécurisé des mots de passe à l'invite.
Veuillez saisir les paramètres d'authentification nécessaires à l'invite. Ces valeurs doivent correspondre à celles indiquées lors de la création de l'archivage sécurisé des mots de passe.Note
Le mot de passe du keystore doit être fourni au format texte brut et non pas au format caché.- Saisissez
1(un) pour sélectionner « Check whether a secured attribute exists » (Vérifiez l'existence d'un attribut sécurisé). - Veuillez saisir le nom du bloc d'archivage sécurisé dans lequel la chaîne sensible est stockée.
- Veuillez saisir le nom de la chaîne sensible à vérifier.
Si la chaîne sensible est stockée dans le bloc d'archivage sécurisé spécifié, vous obtiendrez un message de confirmation semblable au suivant :
Une valeur existe pour (VAULT_BLOCK, ATTRIBUTE)
Une valeur existe pour (VAULT_BLOCK, ATTRIBUTE)
Aucune valeur n'a été stockée pour (VAULT_BLOCK, ATTRIBUTE)
Aucune valeur n'a été stockée pour (VAULT_BLOCK, ATTRIBUTE)
Exemple 17.26. Vérifier une chaîne sensible de manière interactive
Procédure 17.15. Vérifier une chaîne sensible de manière non-interactive
- Lancez l'interface en ligne de commande de votre système d'exploitation et exécutez la commande d'archivage sécurisé des mots de passe. Utilisez
EAP_HOME/bin/vault.sh(sur Red Hat Enterprise Linux et systèmes d'exploitation similaires) ouEAP_HOME\bin\vault.bat(sur Microsoft Windows Server).Remplacez les espaces réservés par vos propres valeurs. Les valeurs des paramètresKEYSTORE_URL,KEYSTORE_PASSWORD-passwordetKEYSTORE_ALIASdoivent correspondre à celles fournies lors de la création de l'archivage sécurisé des mots de passe.Note
Le mot de passe du keystore doit être fourni au format texte brut et non pas au format caché.EAP_HOME/bin/vault.sh --keystore KEYSTORE_URL --keystore-password KEYSTORE_PASSWORD --alias KEYSTORE_ALIAS --check-sec-attr --vault-block VAULT_BLOCK --attribute ATTRIBUTE --enc-dir ENC_FILE_DIR --iteration ITERATION_COUNT --salt SALT
EAP_HOME/bin/vault.sh --keystore KEYSTORE_URL --keystore-password KEYSTORE_PASSWORD --alias KEYSTORE_ALIAS --check-sec-attr --vault-block VAULT_BLOCK --attribute ATTRIBUTE --enc-dir ENC_FILE_DIR --iteration ITERATION_COUNT --salt SALTCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Si la chaîne sensible est stockée dans le bloc d'archivage sécurisé spécifié, vous obtiendrez le message suivant :
Le mot de passe existe déjà
Le mot de passe existe déjà
Ce mot de passe n'existe pas.
Ce mot de passe n'existe pas.
17.7.12. Supprimer une chaîne sensible de l'archivage sécurisé des mots de passe Copier lienLien copié sur presse-papiers!
Pour des raisons de sécurité, il est préférable de supprimer les chaînes sensibles de l'archivage sécurisé des mots de passe lorsqu'elles ne sont plus nécessaires. Par exemple, si vous désactivez une application, toute chaîne sensible utilisée dans une définition de base de données devra être supprimée en même temps.
Avant de supprimer une chaîne sensible de l'archivage sécurisé des mots de passe, confirmez si celle-ci est utilisée dans la configuration de JBoss EAP. Une méthode consiste à utiliser l'utilitaire « grep » pour rechercher les fichiers de configuration d'instances de la chaîne masquée. Sur Red Hat Enterprise Linux (et systèmes d'exploitation identiques), grep est installé par défaut, mais il doit être installé manuellement pour Microsoft Windows Server.
Procédure 17.16. Supprimer une chaîne sensible de manière interactive
Exécutez la commande d'archivage sécurisé des mots de passe
Lancez l'interface en ligne de commande de votre système d'exploitation et exécutezEAP_HOME/bin/vault.sh(sur Red Hat Enterprise Linux et systèmes d'exploitation similaires) ouEAP_HOME\bin\vault.bat(sur Microsoft Windows Server). Démarrez une nouvelle session interactive en tapant0(zéro).Saisir les informations d'authentification
Veuillez saisir les paramètres d'authentification nécessaires à l'invite. Ces valeurs doivent correspondre à celles indiquées lors de la création de l'archivage sécurisé des mots de passe.Note
Le mot de passe du keystore doit être fourni au format texte brut et non pas au format caché.- Veuillez saisir
2(deux) pour choisir l'optionRemove secured attribute(Supprimer l'attribut sécurisé). - Veuillez saisir le nom du bloc d'archivage sécurisé dans lequel la chaîne sensible est stockée.
- Veuillez saisir le nom de la chaîne sensible à supprimer.
Si la chaîne sensible est supprimée, vous obtiendrez un message de confirmation semblable au suivant :
Secured attribute [VAULT_BLOCK::ATTRIBUTE] has been successfully removed from vault
Secured attribute [VAULT_BLOCK::ATTRIBUTE] has been successfully removed from vault
Secured attribute [VAULT_BLOCK::ATTRIBUTE] was not removed from vault, check whether it exist
Secured attribute [VAULT_BLOCK::ATTRIBUTE] was not removed from vault, check whether it exist
Exemple 17.27. Supprimer une chaîne sensible de manière interactive
Procédure 17.17. Supprimer une chaîne sensible de manière non-interactive
- Lancez l'interface en ligne de commande de votre système d'exploitation et exécutez la commande d'archivage sécurisé des mots de passe. Utilisez
EAP_HOME/bin/vault.sh(sur Red Hat Enterprise Linux et systèmes d'exploitation similaires) ouEAP_HOME\bin\vault.bat(sur Microsoft Windows Server).Remplacez les espaces réservés par vos propres valeurs. Les valeurs des paramètresKEYSTORE_URL,KEYSTORE_PASSWORDetKEYSTORE_ALIASdoivent correspondre à celles fournies lors de la création de l'archivage sécurisé des mots de passe.Note
Le mot de passe du keystore doit être fourni au format texte brut et non pas au format caché.EAP_HOME/bin/vault.sh --keystore KEYSTORE_URL --keystore-password KEYSTORE_PASSWORD --alias KEYSTORE_ALIAS --remove-sec-attr --vault-block VAULT_BLOCK --attribute ATTRIBUTE --enc-dir ENC_FILE_DIR --iteration ITERATION_COUNT --salt SALT
EAP_HOME/bin/vault.sh --keystore KEYSTORE_URL --keystore-password KEYSTORE_PASSWORD --alias KEYSTORE_ALIAS --remove-sec-attr --vault-block VAULT_BLOCK --attribute ATTRIBUTE --enc-dir ENC_FILE_DIR --iteration ITERATION_COUNT --salt SALTCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Si la chaîne sensible est supprimée, vous obtiendrez un message de confirmation semblable au suivant :
Secured attribute [VAULT_BLOCK::ATTRIBUTE] has been successfully removed from vault
Secured attribute [VAULT_BLOCK::ATTRIBUTE] has been successfully removed from vault
Secured attribute [VAULT_BLOCK::ATTRIBUTE] was not removed from vault, check whether it exist
Secured attribute [VAULT_BLOCK::ATTRIBUTE] was not removed from vault, check whether it exist
Exemple 17.28. Supprimer une chaîne sensible de manière non-interactive
17.8. Java Authorization Contract for Containers (JACC) Copier lienLien copié sur presse-papiers!
17.8.1. Java Authorization Contract for Containers (JACC) Copier lienLien copié sur presse-papiers!
17.8.2. Configurer la sécurité JACC (Java Authorization Contract for Containers) Copier lienLien copié sur presse-papiers!
jboss-web.xml pour y inclure les paramètres qu'il faut.
Pour ajouter JACC au domaine de sécurité, ajouter la police d'autorisation JACC à la pile d'autorisations du domaine de sécurité, avec l'indicateur requis. Voici un exemple de domaine de sécurité avec support JACC. Cependant, le domaine de sécurité est configuré dans la console de gestion ou dans l'interface CLI, plutôt que directement dans le code XML.
Le fichier jboss-web.xml se trouve dans WEB-INF/ de votre déploiement, et contient des ajouts ou remplacements de configuration spécifique JBoss pour le conteneur web. Pour utiliser votre domaine de sécurité activé-JACC, vous devrez inclure l'élément <security-domain>, et aussi définir l'élément <use-jboss-authorization> à true. L'application suivante est configurée correctement pour pouvoir utiliser le domaine de sécurité JACC ci-dessus.
<jboss-web>
<security-domain>jacc</security-domain>
<use-jboss-authorization>true</use-jboss-authorization>
</jboss-web>
<jboss-web>
<security-domain>jacc</security-domain>
<use-jboss-authorization>true</use-jboss-authorization>
</jboss-web>
La façon de configurer les EJB à utiliser un domaine de sécurité et JACC différe des applications Web. Pour un EJB, vous pouvez déclarer des method permissions sur une méthode ou sur un groupe de méthodes, dans le descripteur ejb-jar.xml. Dans l'élément <ejb-jar>, chaque élément <method-permission> dépendant contient des informations sur les roles JACC. Voir l'exemple de configuration pour plus d'informations. La classe EJBMethodPermission fait partie de Java Enterprise Edition 6 API, et est documentée dans http://docs.oracle.com/javaee/6/api/javax/security/jacc/EJBMethodPermission.html.
Exemple 17.29. Exemple de permissions de méthode JACC dans un EJB
jboss-ejb3.xml qui se trouve dans l'élément enfant <security>. En plus du domaine de sécurité, vous pouvez également spécifier le <run-as-principal>, qui change le principal que l'EJB exécute.
Exemple 17.30. Exemple de déclaration de domaine de sécurité dans un EJB
17.9. Java Authentication SPI for Containers (JASPI) Copier lienLien copié sur presse-papiers!
17.9.1. Sécurité Java Authentication SPI pour Conteneurs (JASPI) Copier lienLien copié sur presse-papiers!
17.9.2. Configuration de la sécurité Java Authentication SPI pour conteneurs (JASPI) Copier lienLien copié sur presse-papiers!
<authentication-jaspi> à votre domaine de sécurité. La configuration est similaire à celle d'un module d'authentification standard, mais les éléments de module de login sont inclus dans l'élément <login-module-stack>. La structure de configuration est la suivante :
Exemple 17.31. Structure de l'élément authentication-jaspi
EAP_HOME/domain/configuration/domain.xml ou dans le fichier EAP_HOME/standalone/configuration/standalone.xml.
Chapitre 18. Single Sign On (SSO) Copier lienLien copié sur presse-papiers!
18.1. SSO (Single Sign On) pour les applications web Copier lienLien copié sur presse-papiers!
Single Sign On (SSO) autorise l'authentification à une ressource, en vue d'autoriser implicitement l'accès à d'autres ressources.
SSO non-clusterisée limite le partage des informations d'accès à des applications d'un même hôte virtuel. En outre, il n'y a aucun mécanisme de résilience en cas de défaillance de l'hôte. Les données d'authentification SSO clusterisées peuvent être partagées entre les applications de plusieurs hôtes et sont résistantes au basculement. De plus, SSO clusterisée est capable de recevoir des demandes d'un équilibreur de charges.
Si une ressource n'est pas protégée, un utilisateur n'a pas besoin de s'authentifier. Si un utilisateur accède à une ressource protégée, l'utilisateur devra s'authentifier.
18.2. SSO (Single Sign On) clusterisées pour les applications web Copier lienLien copié sur presse-papiers!
jboss-web.xml.
18.3. Choisir l'implémentation SSO qui vous convient Copier lienLien copié sur presse-papiers!
web.xml. Une SSO clusterisée permet la réplication des informations d'identité et de contexte de sécurité, indépendamment du fait de savoir si les applications sont elles-mêmes clusterisées. Bien que ces technologies peuvent être utilisées conjointement, elles repésentent des concepts distincts.
Si votre organisation utilise déjà une authentification basée Kerberos et un système d'autorisation comme Microsoft Active Directory, vos pourrez utiliser les mêmes systèmes pour vous authentifier de façon transparente à vos applications Enterprise en cours d'exécution sur JBoss EAP 6.
Si vous exécutez un certain nombre d'applications sur une seule instance et que vous avez besoin d'activer une réplication de session SSO pour ces applications, la SSO non clusterisée sera la solution indiquée.
Si vous exécutez une ou plusieurs applications dans un cluster et que vous avez besoin d'activer une réplication de session SSO pour toutes ces applications, la SSO clusterisée sera la solution indiquée.
18.4. Utilisation de SSO (Single Sign On) pour les applications web Copier lienLien copié sur presse-papiers!
Les fonctionnalités SSO (Single Sign On) sont fournies par les sous-systèmes web et Infinispan. Utilisez cette procédure pour configurer SSO dans les applications web.
Conditions préalables
- Vous devez avoir un domaine de sécurité configuré qui gère les authentifications et l'accès.
- Le sous-système
infinispan. Présent, par défaut, dans tous les profils de domaines gérés ou de serveurs autonomes. - Le
webcache-conteneuret le cache-répliqué SSO. Les fichiers de configurations initiaux contiennent déjà le cache-conteneurweb, et certaines des configurations contiennent déjà le cache-répliqué SSO également. Utilisez les commandes suivantes pour vérifier et activer le cache répliqué SSO. Notez que ces commandes modifient le profilhad'un domaine géré. Vous pouvez modifier les commandes pour utiliser un profil différent, ou supprimer la portion/profile=hade la commande, pour un serveur autonome.Exemple 18.1. Vérifier le cache-conteneur
webLes profils et les configurations mentionnées ci-dessus incluent le cache-conteneurwebpar défaut. Utilisez la commande suivante pour vérifier sa présence. Si vous utilisez un profil différent, remplacez par son nom à la place deha./profile=ha/subsystem=infinispan/cache-container=web/:read-resource(recursive=false,proxies=false,include-runtime=false,include-defaults=true)
/profile=ha/subsystem=infinispan/cache-container=web/:read-resource(recursive=false,proxies=false,include-runtime=false,include-defaults=true)Copy to Clipboard Copied! Toggle word wrap Toggle overflow Si le résultat affiche unsuccess, le sous-système sera présent. Sinon, vous devrez l'ajouter.Exemple 18.2. Ajouter le cache-conteneur
webUtilisez les trois commandes suivantes pour activer le cache-conteneurwebà votre configuration. Modifiez le nom du profil selon le cas, ainsi que les autres paramètres. Ici, les paramètres sont ceux utilisés dans une configuration par défaut./profile=ha/subsystem=infinispan/cache-container=web:add(aliases=["standard-session-cache"],default-cache="repl",module="org.jboss.as.clustering.web.infinispan")
/profile=ha/subsystem=infinispan/cache-container=web:add(aliases=["standard-session-cache"],default-cache="repl",module="org.jboss.as.clustering.web.infinispan")Copy to Clipboard Copied! Toggle word wrap Toggle overflow /profile=ha/subsystem=infinispan/cache-container=web/transport=TRANSPORT:add(lock-timeout=60000)
/profile=ha/subsystem=infinispan/cache-container=web/transport=TRANSPORT:add(lock-timeout=60000)Copy to Clipboard Copied! Toggle word wrap Toggle overflow /profile=ha/subsystem=infinispan/cache-container=web/replicated-cache=repl:add(mode="ASYNC",batching=true)
/profile=ha/subsystem=infinispan/cache-container=web/replicated-cache=repl:add(mode="ASYNC",batching=true)Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple 18.3. Vérifier le cache-répliqué
SSOÉxécutez la commande de Management CLI suivante :/profile=ha/subsystem=infinispan/cache-container=web/:read-resource(recursive=true,proxies=false,include-runtime=false,include-defaults=true)
/profile=ha/subsystem=infinispan/cache-container=web/:read-resource(recursive=true,proxies=false,include-runtime=false,include-defaults=true)Copy to Clipboard Copied! Toggle word wrap Toggle overflow Cherchez une sortie qui ressemble à ceci :"sso" => {Si vous ne la trouvez pas, le cache-répliqué SSO ne sera pas présent dans votre configuration.Exemple 18.4. Ajouter le cache-répliqué
SSO/profile=ha/subsystem=infinispan/cache-container=web/replicated-cache=sso:add(mode="SYNC", batching=true)
/profile=ha/subsystem=infinispan/cache-container=web/replicated-cache=sso:add(mode="SYNC", batching=true)Copy to Clipboard Copied! Toggle word wrap Toggle overflow
web doit être configuré pour utiliser SSO. La commande suivante active SSO sur le serveur virtuel appelé default-host et le domaine de cookies domaine.com. Le nom de cache est sso, et une nouvelle authentification est désactivée.
/profile=ha/subsystem=web/virtual-server=default-host/sso=configuration:add(cache-container="web",cache-name="sso",reauthenticate="false",domain="domain.com")
/profile=ha/subsystem=web/virtual-server=default-host/sso=configuration:add(cache-container="web",cache-name="sso",reauthenticate="false",domain="domain.com")
jboss-web.xml et le même Realm dans son fichier de configuration web.xml.
Configurer sso sous le sous-système web dans le profil utilisateur. La version ClusteredSingleSignOn est utilisée quand l'attribut cache-container est présent, sinon la classe SingleSignOn sera utilisée.
Exemple 18.5. Exemple de configuration SSO non clusterisée
/subsystem=web/virtual-server=default-host/sso=configuration:add(reauthenticate="false")
/subsystem=web/virtual-server=default-host/sso=configuration:add(reauthenticate="false")
Une application peut rendre invalide une session en invoquant la méthode javax.servlet.http.HttpSession.invalidate().
18.5. Kerberos Copier lienLien copié sur presse-papiers!
18.6. SPNEGO Copier lienLien copié sur presse-papiers!
18.7. Microsoft Active Directory Copier lienLien copié sur presse-papiers!
- LDAP (Lightweight Directory Access Protocol) stocke les informations utilisateurs, ordinateurs, mots de passe et autres ressources.
- Kerberos procure une authentification sécurisée sur le réseau.
- DNS (Domain Service Name) fournit des mappages entre les adresses IP, les noms d'hôtes et les ordinateurs ou autres périphériques du réseau.
18.8. Configuration de Kerberos ou Microsoft Active Directory Desktop SSO pour les applications web Copier lienLien copié sur presse-papiers!
Pour authentifier vos applications web ou EJB à l'aide de l'authentification basée Kerberos existante de votre organisation et de votre infrastructure d'autorisation, comme Microsoft Active Directory, vous pouvez utiliser les fonctionnalités de JBoss Negotiation intégrées dans JBoss EAP 6. Si vous configurez votre application web correctement, une connexion réussie en desktop ou réseau sera suffisante pour vous authentifier en toute transparence dans votre application web, donc aucune invite de connexion supplémentaire ne sera nécessaire.
Il existe des différences notables entre la plateforme JBoss EAP 6 et les versions précédentes :
- Les domaines de sécurité sont configurés pour chaque profil d'un domaine géré, ou pour chaque serveur autonome. Ils ne font pas partie du déploiement lui-même. Le domaine de sécurité qu'un déploiement doit utiliser est nommé dans le fichier de déploiement
jboss-web.xmloujboss-ejb3.xml. - Les propriétés de sécurité sont configurées dans le cadre d'un domaine de sécurité. Elles ne font pas partie du déploiement.
- Vous pouvez ne plus remplacer les authentificateurs dans votre déploiement. Toutefois, vous pouvez ajouter une valve NegotiationAuthenticator à votre descripteur
jboss-web.xmlafin d'obtenir le même effet. La valve nécessite toujours les éléments<security-constraint>et<login-config>à définir dans le fichierweb.xml. Ils servent à décider quelles ressources sont sécurisées. Cependant, l'auth-method choisie sera substituée par la valve NegotiationAuthenticator du fichierjboss-web.xml. - Les attributs
CODEdes domaines de sécurité utilisent maintenant un nom simple au lieu d'un nom de classe complet. Le tableau suivant montre les mappages entre les classes utilisées pour JBoss Negotiation, et leurs classes.
| Nom simple | Nom de classe | But |
|---|---|---|
| Kerberos |
com.sun.security.auth.module.Krb5LoginModule
com.ibm.security.auth.module.Krb5LoginModule
|
Module de connexion Kerberos quand on utilise le JDK d'Oracle.
Module de connexion Kerberos quand on utilise le JDK d'IBM.
|
| SPNEGO | org.jboss.security.negotiation.spnego.SPNEGOLoginModule | Le mécanisme qui permet aux applications web de s'authentifier à votre serveur d'authentification Kerberos. |
| AdvancedLdap | org.jboss.security.negotiation.AdvancedLdapLoginModule | Utilisé avec les serveurs LDAP autres que Microsoft Active Directory. |
| AdvancedAdLdap | org.jboss.security.negotiation.AdvancedADLoginModule | Utilisé avec les serveurs Microsoft Active Directory LDAP. |
JBoss Negotiation Toolkit est un outil de débogage que vous pouvez télécharger à partir de https://community.jboss.org/servlet/JiveServlet/download/16876-2-34629/jboss-negotiation-toolkit.war. Il est fourni comme un outil supplémentaire pour vous aider à déboguer et tester les mécanismes d'authentification avant d'introduire votre application en production. C'est un outil non pris en charge, mais considéré comme très utile. Comme SPNEGO, cet outil peut être difficile à configurer pour les applications web.
Procédure 18.1. Installation de l'authentification SSO (Single Sign On) pour les Applications Web ou EJB
Configurer un domaine de sécurité qui représente l'identité de votre serveur. Définir les propriétés système si nécessaire.
Le premier domaine de sécurité authentifie le conteneur lui-même au service de répertoires. Il a besoin d'utiliser un module de connexion qui accepte un type de mécanisme de connexion statique, car un utilisateur réel n'est pas impliqué. Cet exemple utilise une entité de sécurité statique et fait référence à un fichier keytab qui contient les informations d'identification.Le code XML est donné ici dans un but de clarification, mais vous devez utiliser la console de gestion ou l'interface CLI pour configurer vos domaines de sécurité.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Configurer un second domaine de sécurité pour sécuriser l'application web ou les applications. Définir les propriétés système si nécessaire.
Le deuxième domaine de sécurité est utilisé pour authentifier l'utilisateur particulier au serveur d'authentification Kerberos ou SPNEGO. Vous avez besoin d'au moins un module de connexion pour authentifier l'utilisateur et un autre à la recherche de rôles à appliquer à l'utilisateur. Le code XML suivant montre un exemple de domaine de sécurité SPNEGO. Il inclut un module d'autorisation pour mapper les rôles aux utilisateurs individuels. Vous pouvez également utiliser un module de recherche pour les rôles sur le serveur d'authentification lui-même.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Spécifier la security-constraint et la login-config dans le fichier
web.xmlLe descripteurweb.xmlcontient des informations sur les contraintes de sécurité et sur la configuration de la connexion. En voici des exemples :Copy to Clipboard Copied! Toggle word wrap Toggle overflow Indiquer le domaine de sécurité et les autres paramètres dans le descripteur
jboss-web.xml.Spécifiez le nom du domaine de la sécurité côté client (l'autre dans cet exemple) dans le descripteurjboss-Web.xmlde votre déploiement, pour obliger votre application à utiliser ce domaine de sécurité.Vous ne pouvez plus remplacer les authentificateurs directement. À la place, vous devez ajouter NegotiationAuthenticator comme valve au descripteurjboss-web.xmlsi nécessaire.<jacc-star-role-allow>vous permet d'utiliser un astérisque (*) pour faire correspondre plusieurs noms de rôles, et est optionnel.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Ajouter une dépendance au
MANIFEST.MFde votre application, pour trouver l'emplacement des classes Negotiation.L'application web a besoin d'une dépendance sur la classeorg.jboss.security.negotiationà ajouter au manifesteMETA-INF/MANIFEST.MFdu déploiement pour pouvoir localiser les classes JBoss Negotiation. Ce qui suit vous montre une entrée formatée correctement.Manifest-Version: 1.0 Build-Jdk: 1.6.0_24 Dependencies: org.jboss.security.negotiation
Manifest-Version: 1.0 Build-Jdk: 1.6.0_24 Dependencies: org.jboss.security.negotiationCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Sinon, ajouter une dépendance à votre application en modifiant le fichier
META-INF/jboss-deployment-structure.xml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Votre application web accepte et authentifie les informations d'identification avec Kerberos, Active Directory de Microsoft ou autre service de répertoire compatible SPNEGO. Si l'utilisateur exécute l'application d'un système qui est déjà enregistré dans le service de répertoires, et où les rôles sont déjà appliqués à l'utilisateur, l'application web n'aura pas besoin d'authentification, et les fonctionnalités SSO seront opérationnelles.
18.9. Configurer SPNEGO avec un renvoi à l'authentification Form Copier lienLien copié sur presse-papiers!
Procédure 18.2. Sécurité SPNEGO avec renvoi à l'authentification Form
Configurer SPNEGO
Voir la procédure décrite dans Section 18.8, « Configuration de Kerberos ou Microsoft Active Directory Desktop SSO pour les applications web »Modifier le fichier
web.xmlAjouter un élémentlogin-configà votre application et configurer les pages de connexion et d'erreurs dans le fichier web.xml :Copy to Clipboard Copied! Toggle word wrap Toggle overflow Ajouter un contenu web
Ajouter des references delogin.htmlet deerror.htmlàweb.xml. Ces fichiers sont ajoutés à l'archive d'application web à l'emplacement spécifié dans la configurationform-login-config. Pour obtenir des informations, voir la section Enable Form-based Authentication du Security Guide de JBoss EAP 6. Un fichierlogin.htmltypique ressemble à ceci :Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Note
18.10. Domaine du cookie Copier lienLien copié sur presse-papiers!
18.10.1. Cookie Domain Copier lienLien copié sur presse-papiers!
/. Cela signifie que seul l'hôte d'origine peut lire le contenu d'un cookie. Le fait de configurer un domaine de cookie particulier rend le contenu du cookie disponible à un plus grand nombre d'hôtes. Pour configurer le domaine de cookie, veuillez vous référer à Section 18.10.2, « Configurer Cookie Domain ».
18.10.2. Configurer Cookie Domain Copier lienLien copié sur presse-papiers!
http://app1.xyz.com et http://app2.xyz.com à partager un contexte SSO, même si ces applications fonctionnent sur des serveurs différents dans un cluster ou si l'hôte virtuel avec lequel ils sont associés possède plusieurs alias.
Exemple 18.6. Exemple de configuration de domaine de cookie
<Valve className="org.jboss.web.tomcat.service.sso.ClusteredSingleSignOn"
cookieDomain="xyz.com" />
<Valve className="org.jboss.web.tomcat.service.sso.ClusteredSingleSignOn"
cookieDomain="xyz.com" />
Chapitre 19. Références de sécurité pour le développement Copier lienLien copié sur presse-papiers!
19.1. Référence de paramètre de sécurité EJB Copier lienLien copié sur presse-papiers!
| Élément | Description |
|---|---|
<security-identity>
|
Contient des éléments enfants relatifs à l'identité de sécurité d'un EJB.
|
<use-caller-identity />
|
Indique que l'EJB utilise la même identité de sécurité que l'appelant.
|
<run-as>
|
Contient un élément
<role-name>.
|
<run-as-principal>
|
Si présent, indique le principal assigné aux appels sortants. Si non présent, les appels sortants sont assignés à un principal nommé
anonymous.
|
<role-name>
|
Spécifie le role d'exécution de l'EJB.
|
<description>
|
Décrit le role nommé dans
. <role-name>
|
Exemple 19.1. Exemples d'identité de sécurité
<session>.
Chapitre 20. Références de configuration Copier lienLien copié sur presse-papiers!
20.1. Référence de configuration jboss-web.xml Copier lienLien copié sur presse-papiers!
Les descripteurs de déploiement jboss-web.xml et web.xml sont tous les deux mis dans le répertoire WEB-INF du déploiement. jboss-web.xml est un descripteur de déploiement d'une application web de JBoss EAP qui contient des options de configuration supplémentaires qui servent à des fonctionnalités supplémentaires de JBoss Web. Ce descripteur peut être utilisé pour remplacer les paramètres de configuration du descripteur web.xml et définir les paraméètres spécifiques àJBoss EAP.
La plupart des paramètres de configuration font correspondre les prérequis définis dans le fichier web.xml de l'application à des ressources locales. Pour plus d'explications sur les paramètres de configuration de web.xml consulter http://docs.oracle.com/cd/E13222_01/wls/docs81/webapp/web_xml.html.
web.xml requiert jdbc/MyDataSource, alors jboss-web.xml fera sans doute correspondre la source de données globale java:/DefaultDS pour remplir ce besoin. Le WAR utilise la source de données globale pour faire correspondre jdbc/MyDataSource.
| Attribut | Description |
|---|---|
| servlet |
L'élément de servelt spécifie les liaisons spécifiques au servlet.
|
| max-active-sessions |
Indique le nombre maximum de sessions actives autorisées. Si le nombre de sessions gérées par le gestionnaire de sessions dépasse cette valeur et que la
passivation est activée, l'excès sera passivé sur la base du passivation-min-idle-time configuré.
Si défini sur -1, cela signifie aucune limite.
|
| replication-config |
L'élément
replication-config est utilisé pour la réplication de sessions configurées dans le fichier jboss-web.xml.
|
| passivation-config |
L'élément
passivation-config est utilisé pour configurer la passivation de sessions dans le fichier jboss-web.xml.
|
| distinct-name |
L'élément
distinct-name indique le nom précis EJB3 de l'application web.
|
| data-source |
Un mappage à
data-source requis par web.xml.
|
| context-root | Le contexte root de l'application. La valeur par défaut est le nom du déploiement sans le suffixe .war. |
| virtual-host | Le nom de l'hôte virtuel HTTP à partir duquel l'application accepte les requêtes. Se réfère au contenu de l'en-tête de l'Host HTTP. |
| annotation | Décrit une annotation utilisée par l'application. Voir <annotation> pour plus d'information. |
| listener | Décrit un listener utilisée par l'application. Voir <listener> pour plus d'information. |
| session-config | Cet élément remplit la même fonction que l'élément <session-config> du fichier web.xml et est inclus dans un but de compatibilité seulement. |
| valve | Décrit une valve utilisée par l'application. Voir <valve> pour plus d'information. |
| overlay | Le nom d'une couche supplémentaire à ajouter à l'application. |
| security-domain | Le nom du domaine de sécurité utilisé par l'application. Le domaine de sécurité lui-même est configuré à partir de la console de gestion basée web ou l'interface CLI. |
| security-role | Cet élément remplit la même fonction que l'élément <session-role> du fichier web.xml et est inclus dans un but de compatibilité seulement. |
| jacc-star-role-allow |
L'élément
jacc-star-role-allow indique si l'agent générant les permissions jacc de la couche web a besoin de générer une permission WebResourcePermission pour qu'un fournisseur jacc puisse prendre la décision de passer outre l'autorisation ou non.
|
| use-jboss-authorization | Si cet élément est présent et contient la valeur non sensible à la casse "true", la pile d'autorisation web JBoss sera utilisée. S'il n'est pas présent ou contient une valeur non "true", alors seuls les mécanismes d'autorisation indiqués dans les spécifications Java Enterprise Edition seront utilisés. Cet élément est nouveau dans JBoss EAP 6. |
| disable-audit | Définir cet élément de booléen à false pour activer et à true pour désactiver l'auditing web. L'auditing de sécurité web ne fait pas partie de la spécification Java EE. Cet élément est nouveau dans JBoss EAP 6. |
| disable-cross-context | Si sur false, l'application sera en mesure d'appeler un autre contexte d'application. La valeur par défaut est true. |
| enable-websockets | Définir cet élément à true dans jboss-web.xml pour spécifier si l'accès websocket doit être actif pour l'application web. |
<annotation>.
| Attribut | Description |
|---|---|
| class-name |
Nom de la classe de l'annotation
|
| servlet-security |
L'élément, comme
@ServletSecurity, qui représente la sécurité du servlet.
|
| run-as |
L'élément, comme
@RunAs, qui représente l'information run-as
|
| multipart-config |
L'élément, comme
@MultiPart, qui représente l'information multi-config.
|
<listener>.
| Attribut | Description |
|---|---|
| class-name |
Nom de la classe du listener
|
| listener-type |
Liste les éléments de
condition qui indiquent quelle sorte de listener ajouter au contexte de l'application. Les choix valides sont les suivants :
|
| module |
Le nom du module qui contient la classe du listener.
|
| param |
Un paramètre. Contient deux éléments enfants,
<param-name> et <param-value>.
|
Chapitre 21. Références supplémentaires Copier lienLien copié sur presse-papiers!
21.1. Types d'archives Java Copier lienLien copié sur presse-papiers!
| Type d'archive | Extension | But | Exigences pour la structure de répertoire |
|---|---|---|---|
| Archive Java | .jar | Contient les bibliothèques de classes Java. |
Le fichier
META-INF/MANIFEST.MF (optionnel), spécifiant des informations comme quelle classe est la classe principale .
|
| Archive Web | .war |
Contient des fichiers Java Server Pages (JSP), des servlets, et des fichiers XML, en plus des classes et des bibliothèques. Le contenu Archive Web s'appelle aussi Web Application.
|
Le fichier
WEB-INF/web.xml, qui contient des informations sur la structure de l'application web. Il y a également d'autres fichiers présents dans WEB-INF/.
|
| Resource Adapter Archive | .rar |
La structure du répertoire est dans la spécification JCA.
|
Contient un adaptateur de ressources Java Connector Architecture (JCA). S'appelle également un connecteur.
|
| Enterprise Archive | .ear |
Utilisé par Java Enterprise Edition (EE) pour empaqueter un ou plusieurs modules dans une simple archive, pour que les modules puissent être déployés dans le serveur d'applications simultanément. Maven et Ant sont les outils les plus communément utilisés pour générer les archives EAR.
|
Le répertoire
META-INF/ qui contient un ou plusieurs fichiers de descripteurs de déploiement XML.
|
|
N'importe quel type de module.
| |||
| Service Archive | .sar |
Ressemble à une archive Enterprise, spécifique à Enterprise Application Platform.
|
Répertoire
META-INF/ contenant un fichier jboss-service.xml ou jboss-beans.xml.
|
Annexe A. Historique des révisions Copier lienLien copié sur presse-papiers!
| Historique des versions | |||
|---|---|---|---|
| Version 6.4.0-16 | Tuesday April 14 2015 | ||
| |||