131 votes

java.lang.IllegalArgumentException : Aucun convertisseur trouvé pour la valeur de retour de type

Avec ce code

@RequestMapping(value = "/bar/foo", method = RequestMethod.GET)
    public ResponseEntity<foo> foo() {

        Foo model;
        ...
        return ResponseEntity.ok(model);
    }
}

J'obtiens l'exception suivante

java.lang.IllegalArgumentException: No converter found for return value of type

Je pense que l'objet ne peut pas être converti en JSON car il manque Jackson. Je ne comprends pas pourquoi, car je pensais que Jackson était intégré à Spring Boot.

J'ai ensuite essayé d'ajouter Jackson au pom.xml mais j'ai toujours la même erreur

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.4.3</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.4.3</version>
</dependency>

Dois-je modifier des propriétés de Spring Boot pour que cela fonctionne ?

1 votes

0 votes

Utilisez le dépôt central pour télécharger les jars Si vous n'êtes pas un utilisateur de maven, vous pouvez trouver ici la version des jars dont vous avez besoin. repo1.maven.org/maven2/com/fasterxml/jackson/core

357voto

Marc Points 3783

Le problème était que l'un des objets imbriqués dans Foo n'avait pas de getter/setter

5 votes

La même chose m'est arrivée, cela m'a sauvé la vie :)

19 votes

I

1 votes

Assurez-vous également que les getter/setters sont public ! (Ou si vous, comme moi, utilisez des classes immuables, assurez-vous que vos champs sont public final pas seulement final )

23voto

Ajoutez la dépendance ci-dessous à votre pom.xml :

 <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.10.0.pr3</version>
</dependency>

4 votes

Spring boot web starter contient la dépendance Jackson par défaut.

0 votes

Oui, mais nous devons remplacer la version, là où c'est nécessaire.

2 votes

Je pense que @heemin a raison, nous n'avons pas besoin de la dépendance jackson-databing séparément lorsque nous utilisons spring boot. Merci

14voto

SkyWalker Points 7044

Utilice @ResponseBody y getter/setter . J'espère que cela résoudra votre problème.

@RequestMapping(value = "/bar/foo", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<foo> foo() {

et mettez à jour votre mvc-dispatcher-servlet.xml :

<mvc:annotation-driven>
     <mvc:message-converters>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
   </mvc:message-converters>
</mvc:annotation-driven>

0 votes

C'est le printemps des chaussures. Je n'ai pas de mvc-dispatcher-servlet. Savez-vous s'il y a une propriété pour ça ?

1 votes

Utiliser un getter/setter pour la classe foo

0 votes

Je ne comprends pas ce que vous voulez dire par là. Le problème est l'objet que j'envoie, pas celui que je reçois. Il n'y a pas de getter/setter

5voto

vish213 Points 305

Le problème s'est produit dans mon cas parce que Spring Framework ne pouvait pas récupérer les propriétés des objets imbriqués. Getters/Setters est une façon de résoudre le problème. Rendre les propriétés publiques est une autre solution rapide et sale pour valider si c'est bien le problème.

3voto

thisisashwani Points 892

J'ai eu le même problème, et malheureusement il n'a pas pu être résolu en ajoutant des méthodes getter, ou en ajoutant des dépendances jackson.

J'ai ensuite regardé le Guide officiel du printemps, et j'ai suivi leur exemple tel qu'il est donné ici - https://spring.io/guides/gs/actuator-service/ - où l'exemple montre également la conversion de l'objet retourné au format JSON.

J'ai ensuite refait mon propre projet, à la différence que cette fois-ci, j'ai également ajouté les dépendances et les plugins de compilation présents dans le fichier de base de données de l'entreprise. pom.xml de l'exemple du Guide officiel du printemps que j'ai mentionné ci-dessus.

La partie dépendances et construction modifiée du fichier XML ressemble à ceci !

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Vous pouvez voir la même chose dans le lien mentionné ci-dessus.

Et comme par magie, du moins pour moi, ça marche. Donc, si vous avez déjà épuisé toutes vos autres options, vous pourriez vouloir essayer ceci, comme ce fut le cas pour moi.

Juste une note en passant, cela n'a pas fonctionné pour moi lorsque j'ai ajouté les dépendances dans mon projet précédent et que j'ai fait l'installation et la mise à jour du projet Maven. J'ai donc dû refaire mon projet à partir de zéro. Je ne me suis pas beaucoup préoccupé de ce problème, car le mien est un projet d'exemple, mais vous pourriez vouloir vérifier cela aussi !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X