Exceptions communes
Erreurs de bibliothèques et de dépendances
Il est possible qu’au démarrage du serveur, des erreurs apparaissent dans la console, empêchant l’exécution des différents services.
Parfois, les erreurs n’apparaissent qu’à l’exécution du code.
Ces erreurs sont des erreurs de bibliothèques et de gestion des dépendances. La plus grande partie des erreurs listées ci-après correspondent au fait que des dépendances nécessaires à l’exécution des services n’ont pas été référencées dans le serveur.
Pour chaque erreur, seront listées plus bas : le message d’erreur affiché dans la console, la bibliothèque concernée en notation Apache Maven et le nom du fichier jar à ajouter à la liste des bibliothèques que le serveur doit utiliser.
Sous Eclipse, pour ajouter une bibliothèque à votre serveur, il faut ouvrir la vue Servers et éteindre le serveur concerné. Pour ouvrir la configuration du serveur, il faut faire un double clic sur le serveur suivi d’un clic sur Open launch configuration puis aller dans l’onglet Classpath. Cliquer sur User Entries puis Add JARs.... Sélectionner pour terminer la bibliothèque à utiliser. Elle pourra, par exemple pour un projet tournant sous Apache CXF, être dans le sous-répertoire target/apache-cxf/WEB-INF/lib/ du projet.
1. Erreurs sous Apache CXF
java.lang.NoClassDefFoundError: org/springframework/security/access/AccessDeniedException
Message d’erreur :
Grave: Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error
creating bean with name 'Security' defined in class path ressource
[com/book/chapter4/applicationContext.xml]: Initialization of bean
failed; nested exception is java.lang.NoClassDefFoundError:
org/springframework/security/access/AccessDeniedException
Dépendance Apache Maven :
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>3.2.1.RELEASE</version>
</dependency>
Bibliothèque à indiquer dans la configuration du serveur :...
Erreurs de configuration et erreurs de code
Les erreurs listées plus bas ne sont pas des erreurs de bibliothèques mais des erreurs de configuration.
1. Erreurs sous Apache CXF
Unsupported configuration attributes: [ ROLE_ADMIN]
Message d’erreur :
Grave: Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error
creating bean with name
'org.springframework.security.access.intercept.aopalliance.Method
SecurityInterceptor#0': Invocation of init method failed; nested
exception is java.lang.IllegalArgumentException: Unsupported
configuration attributes: [ ROLE_ADMIN]
Pour corriger cette erreur, qui apparaît à l’utilisation de Spring Security, il faut veiller à ne pas mettre d’espace entre ROLE_UTILISATEUR et ROLE_ADMIN dans le fichier applicationContext.xml.
No message body reader has been found
Message d’erreur :
GRAVE: .No message body reader has been found for class : class
com.book.chapter4.TitreMusique, ContentType : application/json.
javax.ws.rs.client.ClientException: .No message body reader has
been found for class : class com.book.chapter4.TitreMusique,
ContentType : application/json.
Le message apparaît lorsqu’un client autonome est créé, par exemple, au sein d’une méthode de type public static void main, et qu’il n’accède pas à la configuration du projet Apache CXF.
Il faut alors manuellement indiquer l’outil qui va désérialiser un JSON en un objet.
Au lieu d’écrire :
final WebClient client = WebClient.create(page)
.path("Musique/TitreMusique/1")
.header("Authorization", "Basic " + chaineEncodee)
.accept(MediaType.APPLICATION_JSON);
TitreMusique reponse = client.get(TitreMusique.class);
il faut mettre :
JAXRSClientFactoryBean sf = new JAXRSClientFactoryBean();
sf.setResourceClass(TitreMusique.class);
sf.setAddress(page);
sf.setProvider(new MOXyJsonProvider());
BindingFactoryManager manager
= sf.getBus()
.getExtension(BindingFactoryManager.class);
JAXRSBindingFactory factory = new JAXRSBindingFactory();
factory.setBus(sf.getBus()); ...
Bugs reconnus
Les erreurs listées plus bas nécessitent une montée de version ou un contournement.
1. Bugs rencontrés sous Jersey
A descriptor for class com.book.chapter4.french.ExceptionDeStatut was not found in the project.
Message d’erreur :
javax.servlet.ServletException:
javax.ws.rs.WebApplicationException: HTTP 500 Internal Server
Error
at
org.glassfish.jersey.servlet.WebComponent.service(WebComponent.
java:392)
[...]
Caused by: javax.ws.rs.WebApplicationException: HTTP 500 Internal
Server Error
at
org.eclipse.persistence.jaxb.rs.MOXyJsonProvider.writeTo
(MOXyJsonProvider.java:810)
[...]
Caused by: javax.xml.bind.MarshalException
- with linked exception:
[Exception [EclipseLink-25003] (Eclipse Persistence Services -
2.5.0.v20130507-3faac2b):
org.eclipse.persistence.exceptions.XMLMarshalException
Exception Description: An error occurred marshalling the object
Internal Exception: Exception [EclipseLink-25007] (Eclipse
Persistence Services - 2.5.0.v20130507-3faac2b):
org.eclipse.persistence.exceptions.XMLMarshalException
Exception Description: A descriptor for class
com.book.chapter4.french.ExceptionDeStatut was not found in the
project. For JAXB, if the JAXBContext was bootstrapped using
TypeMappingInfo[] you must call a marshal method that accepts
TypeMappingInfo...
Autres types d’erreurs
Voici d’autres exceptions qu’il est possible de rencontrer.
1. Erreurs de port
L’erreur suivante peut s’afficher au démarrage du serveur :
ERROR [org.jboss.msc.service.fail] (MSC service thread 1-7)
MSC00001: Failed to start service
jboss.serverManagement.controller.management.http:
org.jboss.msc.service.StartException in service
jboss.serverManagement.controller.management.http: Address already
in use: bind /127.0.0.1:9990
Cela signifie qu’un autre service utilise le port 9990.
Sous Windows, pour connaître le service en question, vous pouvez ouvrir une console pour taper :
netstat -ano | find "9090"
La commande donnera un résultat du type :
TCP 127.0 0.0.0.0:0 LISTENING 2160
Pour obtenir le service concerné, il faudra alors taper :
tasklist | find "2160"
Dans cet exemple, il s’agit de :
NvNetworkService.exe 2160 Services 0
15 140 Ko
NvNetworkService.exe correspond à un service des cartes graphiques Nvidia que vous pouvez décider (ou non) d’arrêter à l’aide de l’application Services de Windows.