java.lang.IllegalArgumentException: Nenhum conversor encontrado para o valor de retorno do tipo

94

Com este código

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

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

Eu recebo a seguinte exceção

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

Meu palpite é que o objeto não pode ser convertido em JSON porque Jackson está faltando. Eu não entendo porque, porque eu pensei que Jackson foi construído com bota de mola.

Tentei adicionar Jackson ao pom.xml, mas continuo com o mesmo erro

<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>

Tenho que alterar alguma propriedade de boot de mola para fazer isso funcionar?

Obrigado

Marc
fonte
1
solução stackoverflow.com/questions/41719142/…
Akshay Vijay Jain
Use o repositório central para baixar jars Se você não for um usuário maven aqui, você pode encontrar a versão necessária dos jars repo1.maven.org/maven2/com/fasterxml/jackson/core
Vivek Mishra

Respostas:

269

O problema era que um dos objetos aninhados em Foonão tinha nenhumgetter/setter

Marc
fonte
3
O mesmo aconteceu comigo, isso salvou minha vida :)
5
só precisa de getters
Oleksandr Loushkin
4
Isso também resolveu meu problema. Se alguém continuar recebendo um erro do Conversor, a causa mais provável é que Jackson não consegue encontrar / processar os getters necessários. Verifique de perto o seu getter POJO! No meu caso, eu tinha um getter de letras minúsculas em uma propriedade em vez do caso camelo esperado: getmetaTag () em vez de getMetaTag ()
Michael M
Muito obrigado!
Hank de
1
Obrigado, sua resposta ajudou, mas no meu caso eu tinha dois nomes de propriedade json idênticos atribuídos a dois campos separados. ou seja, @JsonProperty ("id") ... @JsonProperty ("id"). Parece que este erro é gerado sempre que o serializador jackson falha.
Aaron
21

Adicione a dependência abaixo ao seu pom.xml:

 <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.10.0.pr3</version>
</dependency>
Pra_A
fonte
2
O spring boot web starter contém a dependência de Jackson como padrão.
heemin
Sim, mas precisamos substituir a versão, é necessário
Akshay Vijay Jain
15

Adicione o getter / setter ausente no bean mencionado na mensagem de erro.

Soumyajit Swain
fonte
11

Use @ResponseBodye getter/setter. Espero que isso resolva seu problema.

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

e atualize o seu 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
fonte
é uma bota de mola. Eu não tenho um mvc-dispatcher-servlet. Você sabe se há uma propriedade para isso?
Marc
1
Use getter / setter para a classe foo
SkyWalker de
Eu não entendo o que você quer dizer com isso. O problema é o objeto que envio, mas não recebo. Não há getter / setter
Marc
1
@Marc Sei que não foi o seu problema, mas você pode adicionar conversores de mensagem adicionando um org.springframework.boot.autoconfigure.web.HttpMessageConvertersbean com um @Beanmétodo anotado em sua @SpringBootApplicationclasse. Você pode ver isso apenas lendo a org.springframework.boot.autoconfigure.web.WebMvcAutoconfigurationclasse, o código de autoconfiguração do Spring boot é incrivelmente legível e muitas vezes a maneira mais rápida de descobrir problemas como esses
UTF_or_Death
2
Adicionar "MappingJackson2HttpMessageConverter" funcionou para mim. Obrigado cara. Estou usando o Spring 4.2.5 e estava enfrentando esse problema. Eu adicionei o conversor acima no WebMvcConfigurerAdapter.
Hemant Nagpal
5

O problema ocorreu no meu caso porque o Spring Framework não conseguiu buscar as propriedades de objetos aninhados. Getters / Setters é uma maneira de resolver. Tornar as propriedades públicas é outra solução rápida e suja para validar se esse é realmente o problema.

vish213
fonte
3

Eu tive o mesmo problema e, infelizmente, não foi possível resolvê-lo adicionando métodos getter ou adicionando dependências de jackson.

Em seguida, olhei para Official Spring Guide e segui seu exemplo conforme fornecido aqui - https://spring.io/guides/gs/actuator-service/ - onde o exemplo também mostra a conversão do objeto retornado para o formato JSON.

Então, fiz meu próprio projeto novamente, com a diferença de que desta vez também adicionei as dependências e os plug-ins de construção que estão presentes no arquivo pom.xml do exemplo Official Spring Guide que mencionei acima.

As dependências modificadas e a parte de construção do arquivo XML se parecem com isto!

<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>

Você pode ver o mesmo no link mencionado acima.

E magicamente, pelo menos para mim, funciona. Portanto, se você já esgotou suas outras opções, pode tentar fazer isso, como foi o meu caso.

Apenas uma observação: não funcionou para mim quando adicionei as dependências em meu projeto anterior e fiz o Maven instalar e atualizar as coisas do projeto. Então, eu tive que fazer meu projeto novamente do zero. Eu não me preocupei muito com isso porque o meu é um projeto de exemplo, mas você pode querer procurar por isso também!

Thisisashwani
fonte
2

A anotação @EnableWebMvc na classe de configuração resolveu meu problema. (Spring 5, sem web.xml, inicializado por AbstractAnnotationConfigDispatcherServletInitializer)

usuário 3636486
fonte
2

Ao usar o Spring Boot 2.2, encontro uma mensagem de erro semelhante e ao pesquisar minha mensagem de erro no Google

Nenhum conversor para [class java.util.ArrayList] com Content-Type predefinido 'null'

esta pergunta aqui está no topo, mas todas as respostas aqui não funcionaram para mim, então acho uma boa ideia adicionar a resposta que eu mesmo encontrei:

Tive que adicionar as seguintes dependências ao 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>

Depois disso, preciso adicionar o seguinte à 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;
   }

}

Por último, mas não menos importante, @Controllerusei:

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

Portanto, agora tenho valores de retorno JSON e XML, dependendo do Acceptcabeçalho das solicitações .

Para tornar a saída XML mais legível (remova o nome completo do pacote dos nomes das tags), você também pode adicionar @XStreamAliaso seguinte à sua classe de entidade:

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

Esperançosamente, isso ajudará outras pessoas com o mesmo problema.

PowerStat
fonte
1

Eu estava recebendo o mesmo erro por um tempo. Verifiquei que os métodos getter estavam disponíveis para todas as propriedades. Ainda estava recebendo o mesmo erro. Para resolver um problema, Configure MVC xml (configuração) com

 <mvc:annotation-driven/>

.Isso é necessário para que o Spring detecte a presença de jackson e configure os conversores correspondentes.

Nilay
fonte
1

Eu estava enfrentando o mesmo problema há muito tempo, então descobri que tenho que converter o objeto em JSON usando o Mapeador de Objetos e passá-lo como Objeto 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
fonte
Se você tiver uma nova pergunta, faça-a clicando no botão Fazer pergunta . Inclua um link para esta pergunta se ajudar a fornecer contexto.
iBug
0

Eu também experimentei esse erro quando por acidente coloquei duas linhas idênticas @JsonProperty ("some_value") em propriedades diferentes dentro da classe

Vit Ias
fonte
0

No meu caso, esqueci de adicionar a biblioteca jackson-core.jar, só adicionei jackson-annotations.jar e jackson-databind.jar. Quando adicionei jackson-core.jar, ele corrigiu o problema.

Lisa
fonte
0

Eu vi o mesmo erro quando o escopo da jackson-databinddependência foi definido para test:

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

Remover a <scope>linha corrigiu o problema.

Ovelha elétrica
fonte
0

Encontrou o mesmo erro recentemente - o pojo tinha getters / setters e todas as dependências de jackson foram importadas no pom corretamente, mas de alguma forma "<scope>" foi "fornecido" para a dependência de jackson e isso causou o problema. Remover "<Scope>" da dependência de jackson corrigiu o problema

parthi
fonte
0

Eu enfrentei o mesmo problema, mas estava usando o Lombok e meu UploadFileResponse pojo era um construtor.

public ResponseEntity<UploadFileResponse> 

Para resolver, adicionei a anotação @Getter:

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

No meu caso, estou usando uma bota de mola e encontrei um erro semelhante:

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

Acontece que tenho um controlador com

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

e vergonhosamente eu não estava adicionando o Acceptcabeçalho aos meus pedidos

redd77
fonte
0

você não tem nenhum método getter / setter.

harun ugur
fonte
0

No meu caso, estava retornando Boolean em Response Entity e tinha:

produces = MediaType.TEXT_PLAIN_VALUE,

Quando eu mudei para abaixo

produces = MediaType.APPLICATION_JSON_VALUE

Funcionou!

Exemplo do que eu tinha.

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

A resposta escrita por @Marc também é válida. Mas a resposta concreta é que o Gettermétodo é necessário. Você nem mesmo precisa de um Setter.

Yubaraj
fonte
0

Adicione a dependência abaixo em pom.xml:

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

Estava enfrentando o mesmo problema, pois o tipo de retorno não pode ser vinculado ao MediaType da Classe Foo. Depois de adicionar a dependência funcionou.

Aman Malhotra
fonte