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

94

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 suppose que l'objet ne peut pas être converti en JSON car Jackson est manquant. Je ne comprends pas pourquoi parce que je pensais que Jackson était construit avec une botte à ressort.

Ensuite, j'ai 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 les propriétés des bottes à ressort pour que cela fonctionne?

Je vous remercie

Marc
la source
1
solution stackoverflow.com/questions/41719142/…
Akshay Vijay Jain
Utilisez le référentiel central pour télécharger les fichiers JAR Si vous n'êtes pas un utilisateur maven ici, vous pouvez trouver votre version requise jars repo1.maven.org/maven2/com/fasterxml/jackson/core
Vivek Mishra

Réponses:

269

Le problème était que l'un des objets imbriqués dans Foon'avait aucungetter/setter

Marc
la source
3
La même chose m'est arrivée, cela m'a sauvé la vie :)
5
il n'a besoin que de getters
Oleksandr Loushkin
4
Cela a également résolu mon problème. Si quelqu'un continue de recevoir une erreur de convertisseur, la cause la plus probable est que Jackson ne peut pas trouver / traiter le ou les getter nécessaires. Vérifiez attentivement votre getter POJO! Dans mon cas, j'avais un getter en minuscule sur une propriété au lieu du cas de chameau attendu: getmetaTag () au lieu de getMetaTag ()
Michael M
Merci beaucoup!
Hank
1
Merci votre réponse a aidé, mais dans mon cas, j'avais deux noms de propriété json identiques attribués à deux champs séparés. c'est-à-dire @JsonProperty ("id") ... @JsonProperty ("id"). On dirait que cette erreur est générée chaque fois que le sérialiseur jackson échoue.
Aaron le
21

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>
Pra_A
la source
2
spring boot web starter contient la dépendance Jackson par défaut.
heemin
Oui, mais nous devons remplacer la version, il est nécessaire
Akshay Vijay Jain
15

Ajoutez le getter / setter manquant à l'intérieur du bean mentionné dans le message d'erreur.

Soumyajit Swain
la source
11

Utilisez @ResponseBodyet 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>
SkyWalker
la source
c'est à ressort. Je n'ai pas de mvc-dispatcher-servlet. Savez-vous s'il y a une propriété pour ça?
Marc
1
Utilisez getter / setter pour la classe foo
SkyWalker
Je ne comprends pas ce que vous entendez 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
Marc
1
@Marc Je sais que ce n'était pas votre problème, mais vous pouvez ajouter des convertisseurs de message en ajoutant un org.springframework.boot.autoconfigure.web.HttpMessageConvertersbean avec une @Beanméthode annotée dans votre @SpringBootApplicationclasse. Vous pouvez voir cela en lisant simplement la org.springframework.boot.autoconfigure.web.WebMvcAutoconfigurationclasse, le code d'autoconfiguration de Spring Boot est incroyablement lisible et souvent le moyen le plus rapide de résoudre des problèmes comme ceux
UTF_or_Death
2
L'ajout de "MappingJackson2HttpMessageConverter" a fonctionné pour moi. Merci mec. J'utilise Spring 4.2.5 et j'étais confronté à ce problème. J'ai ajouté le convertisseur ci-dessus dans WebMvcConfigurerAdapter.
Hemant Nagpal
5

Le problème s'est produit dans mon cas, car 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. Rendre les propriétés publiques est une autre solution rapide et sale pour valider si tel est bien le problème.

vish213
la source
3

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 suivi leur exemple 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 à nouveau créé mon propre projet, à la différence que cette fois, j'ai également ajouté les dépendances et les plugins de construction présents dans le fichier pom.xml de l'exemple du guide officiel du printemps que j'ai mentionné ci-dessus.

Les dépendances modifiées et la partie construction du fichier XML ressemblent à 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, au moins pour moi, cela fonctionne. Donc, si vous avez déjà épuisé vos autres options, vous voudrez peut-être essayer ceci, comme ce fut le cas avec moi.

Juste une remarque, cela n'a pas fonctionné pour moi lorsque j'ai ajouté les dépendances dans mon projet précédent et que Maven a installé et mis à jour le contenu du projet. Du coup, j'ai du refaire mon projet à partir de zéro. Cela ne me dérangeait pas beaucoup car le mien est un exemple de projet, mais vous voudrez peut-être le chercher aussi!

thisisashwani
la source
2

L'annotation @EnableWebMvc sur la classe de configuration a résolu mon problème. (Spring 5, pas de web.xml, initialisé par AbstractAnnotationConfigDispatcherServletInitializer)

user3636486
la source
2

Lors de l'utilisation de Spring Boot 2.2, je rencontre un message d'erreur similaire et en recherchant mon message d'erreur sur Google

Aucun convertisseur pour [class java.util.ArrayList] avec le type de contenu prédéfini «null»

cette question ici est en haut, mais toutes les réponses ici n'ont pas fonctionné pour moi, donc je pense que c'est une bonne idée d'ajouter la réponse que j'ai trouvée moi-même:

J'ai dû ajouter les dépendances suivantes au pom.xml:

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-oxm</artifactId>
</dependency>

<dependency>
  <groupId>com.thoughtworks.xstream</groupId>
  <artifactId>xstream</artifactId>
  <version>1.4.11.1</version>
</dependency>

Après cela, je dois ajouter ce qui suit à la classe WebApplication:

@SpringBootApplication
public class WebApplication
 {
  // ...

  @Bean
  public HttpMessageConverter<Object> createXmlHttpMessageConverter()
   {
    final MarshallingHttpMessageConverter xmlConverter = new MarshallingHttpMessageConverter();
    final XStreamMarshaller xstreamMarshaller = new XStreamMarshaller();
    xstreamMarshaller.setAutodetectAnnotations(true);
    xmlConverter.setMarshaller(xstreamMarshaller);
    xmlConverter.setUnmarshaller(xstreamMarshaller);
    return xmlConverter;
   }

}

Dernier point mais non le moindre dans mon, @Controllerj'ai utilisé:

@GetMapping(produces = {MediaType.APPLICATION_XML_VALUE, MediaType. APPLICATION_JSON_VALUE})
@ResponseBody
public List<MeterTypeEntity> listXmlJson(final Model model)
 {
  return this.service.list();
 }

Alors maintenant, j'ai des valeurs de retour JSON et XML en fonction de l'en- Accepttête des demandes .

Pour rendre la sortie XML plus lisible (supprimez le nom complet du package des noms de balises), vous pouvez également ajouter @XStreamAliasce qui suit à votre classe d'entité:

@Table("ExampleTypes")
@XStreamAlias("ExampleType")
public class ExampleTypeEntity
 {
  // ...
 }

Espérons que cela aidera d'autres personnes avec le même problème.

PowerStat
la source
1

J'obtenais la même erreur pendant un certain temps, j'avais vérifié que les méthodes getter étaient disponibles pour toutes les propriétés, mais j'obtenais toujours la même erreur. Pour résoudre un problème Configurez MVC xml (configuration) avec

 <mvc:annotation-driven/>

Cela est nécessaire pour que Spring détecte la présence de jackson et configure les convertisseurs correspondants.

Nilay
la source
1

J'ai été confronté au même problème pendant longtemps, puis j'ai appris à convertir un objet en JSON en utilisant Object Mapper et à le passer en tant qu'objet JSON

@RequestMapping(value = "/getTags", method = RequestMethod.GET)
public @ResponseBody String getTags(@RequestParam String tagName) throws
        JsonGenerationException, JsonMappingException, IOException {
    List<Tag> result = new ArrayList<Tag>();
    for (Tag tag : data) {
        if (tag.getTagName().contains(tagName)) {
            result.add(tag);
        }
    }
    ObjectMapper objectMapper = new ObjectMapper();
    String json = objectMapper.writeValueAsString(result);
    return json;
}
Kiran Kawade
la source
Si vous avez une nouvelle question, posez-la en cliquant sur le bouton Poser une question . Incluez un lien vers cette question si cela permet de fournir un contexte.
iBug
0

J'ai également rencontré une telle erreur lorsque, par accident, j'ai mis deux lignes identiques @JsonProperty ("some_value") sur différentes propriétés à l'intérieur de la classe

Vit Ias
la source
0

Dans mon cas, j'ai oublié d'ajouter la bibliothèque jackson-core.jar, j'ai seulement ajouté jackson-annotations.jar et jackson-databind.jar. Lorsque j'ai ajouté jackson-core.jar, cela a résolu le problème.

Lisa
la source
0

J'ai vu la même erreur lorsque la portée de la jackson-databinddépendance avait été définie sur test:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.9</version>
    <scope>test</scope>
</dependency>

La suppression de la <scope>ligne a résolu le problème.

Mouton électrique
la source
0

J'ai fait face à la même erreur récemment - le pojo avait des getters / setters et toutes les dépendances jackson ont été importées correctement dans pom mais comment "<scope>" était "fourni" pour la dépendance jackson et cela a causé le problème. La suppression de «<Scope>» de la dépendance jackson a résolu le problème

parthi
la source
0

J'ai rencontré le même problème mais j'utilisais Lombok et mon pojo UploadFileResponse était un constructeur.

public ResponseEntity<UploadFileResponse> 

Pour résoudre, j'ai ajouté l'annotation @Getter:

@Builder
@NoArgsConstructor
@AllArgsConstructor
@Getter
public class UploadFileResponse
Aldo Inácio da Silva
la source
0

Dans mon cas, j'utilise Spring Boot et j'ai rencontré une erreur similaire:

No converter for [class java.util.ArrayList] with preset Content-Type 'null'

se trouve que j'ai un contrôleur avec

@GetMapping(produces = { "application/xml", "application/json" })

et honteusement je n'ajoutais pas l'en- Accepttête à mes demandes

redd77
la source
0

vous n'aviez aucune méthode getter / setter.

harun ugur
la source
0

Dans mon cas, je retournais Boolean dans Response Entity et j'avais:

produces = MediaType.TEXT_PLAIN_VALUE,

Quand je l'ai changé en dessous

produces = MediaType.APPLICATION_JSON_VALUE

Ça a marché!

Exemple de ce que j'avais.

@PostMapping(value = "/xxx-xxxx",
            produces = MediaType.APPLICATION_JSON_VALUE,
            consumes = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Boolean> yyyy(
shareef
la source
0

La réponse écrite par @Marc est également valable. Mais la réponse concrète est que la Getterméthode est nécessaire. Vous n'avez même pas besoin d'un Setter.

Yubaraj
la source
0

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

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.10.1</version>
    </dependency>

Était confronté au même problème que le type de retour ne peut pas être lié avec le MediaType de la classe Foo. Après avoir ajouté la dépendance, cela a fonctionné.

Aman Malhotra
la source