Я получаю исключение при попытке сериализации очень простого объекта с использованием Джексона. Ошибка:
org.codehaus.jackson.map.JsonMappingException: не найден сериализатор для класса MyPackage.TestA и не обнаружены свойства для создания BeanSerializer (во избежание исключения отключите SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS))
Ниже приведен простой класс и код для сериализации.
Может кто-нибудь сказать, почему я получаю эту ошибку?
public class TestA {
String SomeString = "asd";
}
TestA testA = new TestA();
ObjectMapper om = new ObjectMapper();
try {
String testAString = om.writeValueAsString(testA); // error here!
TestA newTestA = om.readValue(testAString, TestA.class);
} catch (JsonGenerationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JsonMappingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Ответы:
Как уже было сказано, конфигурация по умолчанию для
ObjectMapper
экземпляра заключается в доступе только к свойствам, которые являются открытыми полями или имеют общедоступные методы получения / установки. Альтернативой изменению определения класса, чтобы сделать поле общедоступным или предоставить общедоступный метод получения / установки, является указание (для базовогоVisibilityChecker
) другого правила видимости свойства. Джексон 1.9 обеспечиваетObjectMapper.setVisibility()
удобный метод для этого. Для примера в оригинальном вопросе, я бы, вероятно, настроил это какДля Джексона> 2.0:
Для получения дополнительной информации и подробностей о связанных параметрах конфигурации, я рекомендую просмотреть JavaDocs на
ObjectMapper.setVisibility()
.источник
myObjectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
{"term":{"call_failed":"true"}}
он генерирует структуру yaml как:filter: map: term: map: call_failed: "true"
Почему он генерируетmap
ключевое слово? Как я могу удалить это?@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
над вашим классомЧтобы Джексон мог сериализовать этот класс,
SomeString
поле должно бытьpublic
(прямо сейчас это изоляция на уровне пакета) или вам нужно определить методы получения и установки для него.источник
У меня та же проблема в моем исходном коде. Я только добавил
и
проблема решена.
источник
В моем случае проблема заключалась в том, что Джексон пытался сериализовать пустой объект без атрибутов и методов.
Как предложено в исключении, я добавил следующую строку, чтобы избежать сбоя на пустых бинах:
Для Джексона 1,9
Для Джексона 2.X
Вы можете найти простой пример отключения Джексона fail_on_empty_beans
источник
У меня была такая же проблема для дочернего класса, где у меня был контроль, объектный картограф находился в общем модуле и был недоступен. Я решил это, добавив эту аннотацию для моего дочернего класса, объект которого должен был быть сериализован.
источник
Если вы можете редактировать класс, содержащий этот объект, я обычно просто добавляю аннотацию
источник
org.codehaus.jackson.annotate.JsonIgnore
Эта ошибка также выдается, если вы забыли добавить метод .build () в свой статус возврата.
Я получил следующую ошибку без метода build ():
источник
SpringBoot2.0 , Я разрешаю это следующим кодом:
источник
Для приложений Java Java добавьте это после
ObjectMapper
создания экземпляра:источник
У меня была похожая проблема с отложенной загрузкой через прокси-объект hibernate. Обошел его, аннотируя класс с лениво загруженными частными свойствами:
источник
Проблема может быть в том, что вы объявили переменную как
private
. Если вы измените его наpublic
, это работает.Лучший вариант - использовать методы получения и установки для него.
Это решит проблему!
источник
Я нашел по крайней мере три способа сделать это:
public getters
свою сущность, которую вы пытаетесь сериализовать;public getters
. Это будет изменить значение по умолчанию для Джексона отVisbility=DEFAULT
до ,@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
где любые модификаторы доступа принимаются;ObjectMapper
глобально, установивobjectMapperInstance.setVisibility(JsonMethod.FIELD, Visibility.ANY);
. Этого следует избегать, если вам не нужны эти функции во всем мире.Выберите в зависимости от ваших потребностей.
источник
Вот три варианта:
public
public
, добавьте геттеры и сеттеры@JsonIgnore("context")
источник
Пожалуйста, используйте это на уровне класса для бобов:
источник
добавление сеттера и геттера также решит проблему, поскольку она исправлена для меня. Например:
источник
Просто у меня были только геттеры, после добавления сеттеров тоже проблемы решались.
источник
Хотя я добавил геттеры и сеттеры, я получил ту же ошибку. Позже я обнаружил ошибку, то есть по совету Сонара я включил геттеры и сеттеры как защищенные, что и вызвало проблему. Как только я установил, что это работает как ожидалось.
источник
весной багажник 2.2.5
после добавления геттера и сеттера
я добавил @JsonIgnore поверх поля.
источник