Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Développer des services REST en Java
  3. Exceptions communes
Extrait - Développer des services REST en Java Échanger des données au format JSON
Extraits du livre
Développer des services REST en Java Échanger des données au format JSON Revenir à la page d'achat du livre

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.