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
java
spring
spring-boot
jackson
Marc
źródło
źródło
Odpowiedzi:
Problem polegał na tym, że jeden z obiektów zagnieżdżonych w programie
Foo
nie miał żadnegogetter/setter
źródło
public
! (Lub jeśli, tak jak ja, korzystasz z niezmiennych klas, upewnij się, że twoje polapublic final
nie są tylkofinal
)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>
źródło
Dodaj brakujący getter / setter wewnątrz komponentu bean wymienionego w komunikacie o błędzie.
źródło
Użyj
@ResponseBody
igetter/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>
źródło
org.springframework.boot.autoconfigure.web.HttpMessageConverters
bean z@Bean
adnotowaną metodą w swojej@SpringBootApplication
klasie. Możesz to zobaczyć, po prostu czytającorg.springframework.boot.autoconfigure.web.WebMvcAutoconfiguration
klasę, kod autokonfiguracji Spring Boot jest niesamowicie czytelny i często najszybszy sposób na rozwiązanie takich problemówProblem 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.
źródło
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!
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ć!
źródło
Adnotacja @EnableWebMvc w klasie konfiguracji rozwiązała mój problem. (Wiosna 5, brak pliku web.xml, zainicjowany przez AbstractAnnotationConfigDispatcherServletInitializer)
źródło
Podczas używania Spring Boot 2.2 napotykam podobny komunikat o błędzie i podczas wyszukiwania w Google mój komunikat o błędzie
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
Accept
nagłówka żądania .Aby zwiększyć czytelność danych wyjściowych XML (usunąć pełną nazwę pakietu z nazw tagów), możesz również dodać
@XStreamAlias
następujące elementy do klasy jednostki:@Table("ExampleTypes") @XStreamAlias("ExampleType") public class ExampleTypeEntity { // ... }
Mam nadzieję, że pomoże to innym z tym samym problemem.
źródło
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
Jest to wymagane, aby Spring wykrył obecność Jacksona i skonfigurował odpowiednie konwertery.
źródło
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; }
źródło
nie miałeś żadnych metod pobierających / ustawiających.
źródło
Odpowiedź napisana przez @Marc jest również ważna. Ale konkretna odpowiedź brzmi:
Getter
metoda jest wymagana. Nie potrzebujesz nawetSetter
.źródło
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
źródło
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.
źródło
Widziałem ten sam błąd, gdy zakres
jackson-databind
zależności został ustawiony natest
:<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.źródło
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
źródło
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
źródło
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
Accept
nagłówka do moich żądańźródło
W moim przypadku zwracałem Boolean w Response Entity i miałem:
Kiedy zmieniłem to poniżej
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(
źródło
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.
źródło