java.lang.IllegalArgumentException: не найден преобразователь для возвращаемого значения типа

96

С этим кодом

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

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

Я получаю следующее исключение

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

Я предполагаю, что объект не может быть преобразован в JSON, потому что Джексон отсутствует. Я не понимаю почему, потому что я думал, что Джексон был построен с пружинными ботинками.

Затем я попытался добавить Джексона в pom.xml, но у меня все еще та же ошибка

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

Нужно ли мне изменять какие-либо свойства весенней загрузки, чтобы эта работа работала?

Спасибо

Марк
источник
1
решение stackoverflow.com/questions/41719142/…
Акшай Виджай Джейн
Используйте центральный репозиторий для загрузки jar-файлов. Если вы не являетесь пользователем maven, здесь вы можете найти jar-файлы
Vivek Mishra

Ответы:

281

Проблема заключалась в том, что у одного из вложенных объектов Fooне было никакихgetter/setter

Марк
источник
3
То же самое случилось со мной, это спасло мне жизнь :)
8
нужны только геттеры
Александр Лушкин
4
Это также решило мою проблему. Если кто-то продолжает получать ошибку конвертера, наиболее вероятной причиной является то, что Джексон не может найти / обработать необходимые геттеры. Внимательно проверьте свой получатель POJO! В моем случае у меня был геттер в нижнем регистре для одного свойства вместо ожидаемого случая верблюда: getmetaTag () вместо getMetaTag ()
Майкл М.
Также убедитесь, что геттеры / сеттеры public! (Или, если вы, как и я, используете неизменяемые классы, убедитесь, что ваши поля public finalне просто final)
иск Моники Фонда
2
Спасибо, ваш ответ помог, но в моем случае у меня было два идентичных имени свойств json, назначенных двум разделенным полям. т.е. @JsonProperty ("id") ... @JsonProperty ("id"). Похоже, эта ошибка возникает всякий раз, когда сериализатор Джексона выходит из строя.
Аарон
21

Добавьте приведенную ниже зависимость к вашему pom.xml:

 <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.10.0.pr3</version>
</dependency>
Pra_A
источник
2
Веб-стартер весенней загрузки по умолчанию содержит зависимость Джексона.
heemin
Да, но нам нужно переопределить версию, там это необходимо
Акшай Виджай Джайн
16

Добавьте отсутствующий геттер / сеттер внутри bean-компонента, упомянутого в сообщении об ошибке.

Сумяджит Суэйн
источник
12

Используйте @ResponseBodyи getter/setter. Надеюсь, это решит вашу проблему.

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

и обновите свой 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>
Ходящий по небу
источник
это пружинный ботинок. У меня нет сервлета-диспетчера mvc. Вы знаете, есть ли для этого недвижимость?
Marc
1
Используйте геттер / сеттер для класса foo
SkyWalker
Я не понимаю, что вы имеете в виду. Проблема в том, что я отправляю, а не получаю. Нет геттера / сеттера
Marc
1
@Marc Я знаю, что это не ваша проблема, но вы можете добавить конвертеры сообщений, добавив org.springframework.boot.autoconfigure.web.HttpMessageConvertersbean-компонент с @Beanаннотированным методом в свой @SpringBootApplicationкласс. Вы можете убедиться в этом, просто прочитав org.springframework.boot.autoconfigure.web.WebMvcAutoconfigurationкласс, код автоконфигурации загрузки Spring невероятно удобочитаем и часто является самым быстрым способом решения подобных проблем
UTF_or_Death 04
2
Добавление «MappingJackson2HttpMessageConverter» сработало для меня. Спасибо чувак. Я использую Spring 4.2.5 и столкнулся с этой проблемой. Я добавил выше конвертер в WebMvcConfigurerAdapter.
Хемант
5

В моем случае проблема возникла из-за того, что фреймворк Spring не смог получить свойства вложенных объектов. Геттеры / сеттеры - это один из способов решения. Публикация свойств - еще одно быстрое и грязное решение, позволяющее проверить, действительно ли это проблема.

виш213
источник
3

У меня была такая же проблема, и, к сожалению, ее нельзя было решить, добавив методы получения или добавив зависимости Джексона.

Затем я просмотрел официальное руководство Spring и последовал их примеру, приведенному здесь - https://spring.io/guides/gs/actuator-service/, где в примере также показано преобразование возвращенного объекта в формат JSON.

Затем я снова создал свой собственный проект, с той разницей, что на этот раз я также добавил зависимости и подключаемые модули сборки, которые присутствуют в файле pom.xml примера Official Spring Guide, о котором я упоминал выше.

Измененные зависимости и часть сборки XML-файла выглядят так!

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

Вы можете увидеть то же самое по указанной выше ссылке.

И волшебным образом, по крайней мере для меня, это работает. Итак, если вы уже исчерпали другие варианты, вы можете попробовать это, как это было в случае со мной.

Кстати, у меня не получилось, когда я добавил зависимости в свой предыдущий проект и установил и обновил материалы проекта Maven. Итак, мне снова пришлось делать свой проект с нуля. Я не особо беспокоился об этом, так как мой проект является примером, но вы тоже можете поискать его!

этоисашвани
источник
2

Аннотация @EnableWebMvc в классе конфигурации решила мою проблему. (Spring 5, без web.xml, инициализируется AbstractAnnotationConfigDispatcherServletInitializer)

user3636486
источник
2

При использовании Spring Boot 2.2 я сталкиваюсь с похожим сообщением об ошибке, а при поиске в Google сообщение об ошибке

Нет конвертера для [класс java.util.ArrayList] с предустановленным Content-Type 'null'

этот вопрос здесь наверху, но все ответы здесь не помогли мне, поэтому я думаю, что было бы неплохо добавить ответ, который я нашел сам:

Мне пришлось добавить следующие зависимости к 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>

После этого мне нужно добавить в класс 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;
   }

}

И последнее, но не менее важное, что @Controllerя использовал:

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

Итак, теперь я получил возвращаемые значения JSON и XML в зависимости от запросов. Accept заголовка .

Чтобы сделать вывод XML более читабельным (удалите полное имя пакета из имен тегов), вы также можете добавить @XStreamAliasследующее в свой класс сущности:

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

Надеюсь, это поможет другим с той же проблемой.

PowerStat
источник
1

Некоторое время я получал ту же ошибку. Я проверял, доступны ли методы получения для всех свойств, но все равно получал ту же ошибку. Для решения проблемы Настройте MVC xml (конфигурацию) с помощью

 <mvc:annotation-driven/>

Это необходимо для Spring, чтобы обнаружить присутствие Джексона и настроить соответствующие преобразователи.

Нилай
источник
1

Я долгое время сталкивался с одной и той же проблемой, затем узнал, что нужно преобразовать объект в JSON с помощью Object Mapper и передать его как объект 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;
}
Киран Каваде
источник
Если у вас есть новый вопрос, задайте его, нажав кнопку « Задать вопрос» . Включите ссылку на этот вопрос, если она помогает понять контекст.
iBug 05
1

у вас не было никаких методов получения / установки.

Харун Угур
источник
1

Ответ, написанный @Marc, также действителен. Но конкретный ответ - Getterметод необходим. Вам даже не нужен Setter.

Юбарадж
источник
0

Я также столкнулся с такой ошибкой, когда случайно поместил две одинаковые строки @JsonProperty ("some_value") в разные свойства внутри класса

Вит Иас
источник
0

В моем случае я забыл добавить библиотеку jackson-core.jar, я добавил только jackson-annotations.jar и jackson-databind.jar. Когда я добавил jackson-core.jar, проблема устранилась.

Лиза
источник
0

Я видел ту же ошибку, когда для области jackson-databindзависимости было установлено значение test:

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

Удаление <scope>строки устранило проблему.

Электрическая овца
источник
0

Недавно столкнулся с такой же ошибкой - у pojo были геттеры / сеттеры, и все зависимости Джексона были импортированы в pom правильно, но каким-то образом "<scope>" был "предоставлен" для зависимости Джексона, и это вызвало проблему. Удаление "<Scope>" из зависимости Джексона устранило проблему.

парти
источник
0

Я столкнулся с той же проблемой, но я использовал Lombok, а мой Pojo UploadFileResponse был конструктором.

public ResponseEntity<UploadFileResponse> 

Чтобы решить эту проблему, я добавил аннотацию @Getter:

@Builder
@NoArgsConstructor
@AllArgsConstructor
@Getter
public class UploadFileResponse
Альдо Инасио да Силва
источник
0

В моем случае я использую весеннюю загрузку, и я столкнулся с аналогичной ошибкой:

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

оказывается, что у меня есть контроллер с

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

и, к сожалению, я не добавлял Acceptзаголовок к своим запросам

redd77
источник
0

В моем случае я возвращал Boolean в Response Entity и имел:

produces = MediaType.TEXT_PLAIN_VALUE,

Когда я изменил его на ниже

produces = MediaType.APPLICATION_JSON_VALUE

Это сработало!

Пример того, что у меня было.

@PostMapping(value = "/xxx-xxxx",
            produces = MediaType.APPLICATION_JSON_VALUE,
            consumes = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Boolean> yyyy(
Шариф
источник
0

Добавьте ниже зависимость в pom.xml:

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

Столкнулся с той же проблемой, что и тип возвращаемого значения не может быть привязан к MediaType класса Foo. После добавления зависимости все заработало.

Аман Малхотра
источник