java.lang.IllegalArgumentException: nie znaleziono konwertera dla zwracanej wartości typu

96

Z tym kodem

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

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

Mam następujący wyjątek

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

Domyślam się, że obiektu nie można przekonwertować na JSON, ponieważ brakuje Jacksona. Nie rozumiem dlaczego, ponieważ myślałem, że Jackson został wbudowany w but sprężynowy.

Następnie próbowałem dodać Jacksona do pom.xml, ale nadal mam ten sam błąd

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

Czy muszę zmienić jakieś właściwości buta sprężynowego, aby to zadziałało?

Dziękuję Ci

Marc
źródło
1
rozwiązanie stackoverflow.com/questions/41719142/…
Akshay Vijay Jain
Użyj centralnego repozytorium, aby pobrać pliki jars Jeśli nie jesteś użytkownikiem maven, tutaj możesz znaleźć wymaganą wersję jars repo1.maven.org/maven2/com/fasterxml/jackson/core
Vivek Mishra

Odpowiedzi:

280

Problem polegał na tym, że jeden z obiektów zagnieżdżonych w programie Foonie miał żadnegogetter/setter

Marc
źródło
3
To samo mi się przydarzyło to uratowało mi życie :)
8
potrzebuje tylko
getterów
4
To również rozwiązało mój problem. Jeśli ktokolwiek nadal otrzymuje błąd konwertera, najbardziej prawdopodobną przyczyną jest to, że Jackson nie może znaleźć / przetworzyć niezbędnych getterów. Sprawdź dokładnie swój getter POJO! W moim przypadku miałem mały getter na jednej właściwości zamiast oczekiwanego przypadku wielbłąda: getmetaTag () zamiast getMetaTag ()
Michael M
Upewnij się również, że metody pobierające / ustawiające są public! (Lub jeśli, tak jak ja, korzystasz z niezmiennych klas, upewnij się, że twoje pola public finalnie są tylko final)
sfinansuj pozew Moniki
2
Dzięki, twoja odpowiedź pomogła, ale w moim przypadku miałem dwie identyczne nazwy właściwości JSON przypisane do dwóch oddzielnych pól. tj. @JsonProperty ("id") ... @JsonProperty ("id"). Wygląda na to, że ten błąd jest zgłaszany za każdym razem, gdy serializator Jackson ulegnie awarii.
Aaron
21

Dodaj poniższą zależność do swojego pom.xml:

 <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.10.0.pr3</version>
</dependency>
Pra_A
źródło
2
Spring boot web starter zawiera domyślnie zależność Jacksona.
heemin
Tak, ale musimy zmienić wersję, tam jest potrzebna
Akshay Vijay Jain
15

Dodaj brakujący getter / setter wewnątrz komponentu bean wymienionego w komunikacie o błędzie.

Soumyajit Swain
źródło
12

Użyj @ResponseBodyi getter/setter. Mam nadzieję, że to rozwiąże Twój problem.

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

i zaktualizuj 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
źródło
to buty sprężynowe. Nie mam serwletu mvc-dispatcher-servlet. Czy wiesz, czy jest do tego właściwość?
Marc
1
Użyj getter / setter dla klasy foo
SkyWalker
Nie rozumiem, co przez to rozumiesz. Problem w tym, że przedmiot, który wysyłam, a nie który otrzymuję. Nie ma gettera / settera
Marc
1
@Marc Wiem, że to nie był twój problem, ale możesz dodać konwertery wiadomości, dodając org.springframework.boot.autoconfigure.web.HttpMessageConvertersbean z @Beanadnotowaną metodą w swojej @SpringBootApplicationklasie. Możesz to zobaczyć, po prostu czytając org.springframework.boot.autoconfigure.web.WebMvcAutoconfigurationklasę, kod autokonfiguracji Spring Boot jest niesamowicie czytelny i często najszybszy sposób na rozwiązanie takich problemów
UTF_or_Death
2
Dodanie „MappingJackson2HttpMessageConverter” działało dla mnie. Dzięki stary. Używam Springa 4.2.5 i miałem ten problem. Dodałem powyższy konwerter w WebMvcConfigurerAdapter.
Hemant Nagpal,
5

Problem wystąpił w moim przypadku, ponieważ framework spring nie mógł pobrać właściwości obiektów zagnieżdżonych. Getters / Setters to jeden ze sposobów rozwiązania. Upublicznienie właściwości to kolejne szybkie i brudne rozwiązanie pozwalające sprawdzić, czy rzeczywiście jest to problem.

vish213
źródło
3

Miałem ten sam problem i niestety nie dało się go rozwiązać poprzez dodanie metod pobierających lub zależności od jacksona.

Następnie spojrzałem na Official Spring Guide i podążyłem za przykładem podanym tutaj - https://spring.io/guides/gs/actuator-service/ - gdzie przykład pokazuje również konwersję zwróconego obiektu do formatu JSON.

Następnie ponownie stworzyłem własny projekt, z tą różnicą, że tym razem dodałem także zależności i wtyczki, które są obecne w pliku pom.xml w przykładzie z oficjalnego przewodnika po sprężynach, o którym wspomniałem powyżej.

Zmodyfikowane zależności i część kompilacji pliku XML wyglądają następująco!

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

Możesz zobaczyć to samo w powyższym linku.

I magicznie, przynajmniej dla mnie, to działa. Jeśli więc wyczerpałeś już swoje inne opcje, możesz spróbować tego, tak jak w przypadku mnie.

Na marginesie, to nie zadziałało, gdy dodałem zależności w moim poprzednim projekcie i Maven zainstalował i zaktualizował elementy projektu. Musiałem więc ponownie stworzyć projekt od zera. Nie przejmowałem się tym zbytnio, ponieważ mój jest przykładowym projektem, ale możesz też tego chcieć poszukać!

thisisashwani
źródło
2

Adnotacja @EnableWebMvc w klasie konfiguracji rozwiązała mój problem. (Wiosna 5, brak pliku web.xml, zainicjowany przez AbstractAnnotationConfigDispatcherServletInitializer)

user3636486
źródło
2

Podczas używania Spring Boot 2.2 napotykam podobny komunikat o błędzie i podczas wyszukiwania w Google mój komunikat o błędzie

Brak konwertera dla [klasy java.util.ArrayList] z wstępnie ustawionym typem zawartości „null”

to pytanie tutaj jest na górze, ale wszystkie odpowiedzi tutaj nie działają dla mnie, więc myślę, że dobrym pomysłem jest dodanie odpowiedzi, którą znalazłem:

Musiałem dodać następujące zależności do 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>

Następnie muszę dodać do klasy 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;
   }

}

Wreszcie, co nie mniej ważne @Controller, użyłem:

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

Więc teraz otrzymałem wartości zwracane przez JSON i XML w zależności od Acceptnagłówka żądania .

Aby zwiększyć czytelność danych wyjściowych XML (usunąć pełną nazwę pakietu z nazw tagów), możesz również dodać @XStreamAliasnastępujące elementy do klasy jednostki:

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

Mam nadzieję, że pomoże to innym z tym samym problemem.

PowerStat
źródło
1

Przez jakiś czas otrzymywałem ten sam błąd, sprawdziłem, czy metody pobierające są dostępne dla wszystkich właściwości, ale nadal otrzymywałem ten sam błąd. Aby rozwiązać problem, Skonfiguruj plik MVC xml (konfiguracja) z

 <mvc:annotation-driven/>

Jest to wymagane, aby Spring wykrył obecność Jacksona i skonfigurował odpowiednie konwertery.

Nilay
źródło
1

Przez długi czas miałem ten sam problem, a potem dowiedziałem się, że muszę przekonwertować obiekt na JSON za pomocą Object Mapper i przekazać go jako obiekt 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
źródło
Jeśli masz nowe pytanie, zadaj je, klikając przycisk Zadaj pytanie . Dołącz link do tego pytania, jeśli pomaga to w dostarczeniu kontekstu.
iBug
1

nie miałeś żadnych metod pobierających / ustawiających.

harun ugur
źródło
1

Odpowiedź napisana przez @Marc jest również ważna. Ale konkretna odpowiedź brzmi: Gettermetoda jest wymagana. Nie potrzebujesz nawet Setter.

Yubaraj
źródło
0

Doświadczyłem również takiego błędu, gdy przez przypadek umieściłem dwie identyczne linie @JsonProperty ("some_value") na różnych właściwościach wewnątrz klasy

Vit Ias
źródło
0

W moim przypadku zapomniałem dodać bibliotekę jackson-core.jar, dodałem tylko jackson-annotations.jar i jackson-databind.jar. Kiedy dodałem plik jackson-core.jar, rozwiązałem problem.

Lisa
źródło
0

Widziałem ten sam błąd, gdy zakres jackson-databindzależności został ustawiony na test:

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

Usunięcie <scope>linii rozwiązało problem.

Elektryczna owca
źródło
0

Niedawno napotkałem ten sam błąd - pojo miało metody pobierające / ustawiające i wszystkie zależności jackson zostały poprawnie zaimportowane w pom, ale niektóre informacje o tym, jak „<scope>” zostały „dostarczone” dla zależności Jacksona, co spowodowało problem. Usunięcie „<Zakres>” z zależności Jacksona rozwiązało problem

parthi
źródło
0

Napotkałem ten sam problem, ale korzystałem z Lombok, a moje UploadFileResponse pojo było konstruktorem.

public ResponseEntity<UploadFileResponse> 

Aby rozwiązać, dodałem adnotację @Getter:

@Builder
@NoArgsConstructor
@AllArgsConstructor
@Getter
public class UploadFileResponse
Aldo Inácio da Silva
źródło
0

W moim przypadku używam rozruchu sprężynowego i napotkałem podobny błąd:

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

okazuje się, że mam kontroler z

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

i niestety nie dodawałem Acceptnagłówka do moich żądań

redd77
źródło
0

W moim przypadku zwracałem Boolean w Response Entity i miałem:

produces = MediaType.TEXT_PLAIN_VALUE,

Kiedy zmieniłem to poniżej

produces = MediaType.APPLICATION_JSON_VALUE

Zadziałało!

Przykład tego, co miałem.

@PostMapping(value = "/xxx-xxxx",
            produces = MediaType.APPLICATION_JSON_VALUE,
            consumes = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Boolean> yyyy(
shareef
źródło
0

Dodaj poniższą zależność w pom.xml:

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

Napotkał ten sam problem, ponieważ zwracanego typu nie można powiązać z typem nośnika klasy Foo. Po dodaniu zależności zadziałało.

Aman Malhotra
źródło