Как отключить fail_on_empty_beans в Джексоне?

100

Используя jackson 2.1, как мне отключить то, fail_on_empty beansчто сообщение об ошибке требует, чтобы я отключил?

Я предполагаю, что это самая простая вещь в мире, но, черт возьми, уже поздно, и я не смог найти простой учебник или что-то особенно очевидное из api. SerializationFactory? Почему они сделали его таким неинтуитивным, а затем сделали сообщение об ошибке таким простым?

Хотя мне и нравится сообщение об ошибке, я имею в виду, что оно лучше, чем NPE.

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

бхарал
источник

Ответы:

126

Я считаю, что вы можете делать это для каждого класса или глобально.

Для каждого класса попробуйте @JsonSerialize выше объявления класса.

Для картографа вот один пример:

ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
// do various things, perhaps:
String someJsonString = mapper.writeValueAsString(someClassInstance);
SomeClass someClassInstance = mapper.readValue(someJsonString, SomeClass.class)

Ссылка на StackOverflow ниже также содержит пример проекта Spring.

Что касается ОТДЫХА с Джерси, я не сразу помню, но считаю, что это похоже.


Пара ссылок, которые я откопал: (отредактировал 1-ю ссылку из-за закрытия Codehaus).

Блин
источник
Я использовал это ранее сегодня, есть дополнительная информация, например, автоматическое обнаружение. stackoverflow.com/questions/4362104/…
Pancakeo 07
1
Можете ли вы привести пример того, как использовать @JsonSerializeдля отключения FAIL_ON_EMPTY_BEANSобъявления класса?
tuk
2
Прошло несколько лет :). Это может помочь: stackoverflow.com/questions/12162413/…
Pancakeo 09
Или вы можете использовать метод отключения класса ObjectMapper, например "mapper.disable (SerializationFeature.FAIL_ON_EMPTY_BEANS)"
Reddeiah Pidugu
43

Если вы используете Spring Boot, вы можете установить следующее свойство в файле application.properties. spring.jackson.serialization.FAIL_ON_EMPTY_BEANS = ложь

абхишек джайн
источник
22

Вы также можете получить ту же проблему, если ваш класс не содержит никаких общедоступных методов / свойств. Обычно у меня есть выделенные DTO для запросов и ответов API, объявленные общедоступными, но в одном случае я забыл сделать также общедоступными методы, что в первую очередь вызвало «пустой» bean-компонент.

RJStanford
источник
13

Вы также, вероятно, можете аннотировать класс, @JsonIgnoreProperties(ignoreUnknown=true)чтобы игнорировать поля, не определенные в классе

AllDayAmazing
источник
1
Это не сработает, если весь bean-компонент на самом деле равен нулю
maryoush
12

Если вы хотите получить объект JSON без каких-либо дополнительных полей - добавьте эту аннотацию в свой класс, у меня она сработала идеально.

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})

Вы также можете добавить эту строку в свой файл application.properties, но это добавит дополнительное поле в ваш JSON.

spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false
user1913615
источник
Я пытался вернуть JSON изнутри одного из моих контроллеров в моем приложении REST с весенней загрузкой, и это исправило его для меня.
ninjasense
Идеальный способ, если у вас есть пустой объект!
Георгий Пеев
3

Если вы используете org.codehaus.jackson.map.ObjectMapper, то пожалуйста. используйте следующие строки

mapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);
тхангаманикаси
источник
3

В Jersey Rest Services просто используйте аннотацию JacksonFeatures ...

@JacksonFeatures(serializationDisable = {SerializationFeature.FAIL_ON_EMPTY_BEANS})
public Response getSomething() {
    Object entity = doSomething();
    return Response.ok(entity).build();
}
мефистофель78
источник
1

В моем случае я пропустил запись аннотации @JsonProperty в одном из полей, вызывающих эту ошибку.

Вахиб Уль Хак
источник
1

Добавление здесь решения для другой проблемы, но проявляющейся с той же ошибкой ... Будьте осторожны при создании json на лету (как ответы api или что-то еще), чтобы избежать буквальных двойных кавычек в элементах строки. Возможно, вы используете свой собственный искаженный файл json.

Кирк Б.
источник
1

Чтобы исправить эту проблему, настройте свой класс JsonDataFormat, как показано ниже

ObjectMapper mapper = new ObjectMapper();
mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);

что почти эквивалентно,

mapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);
Реддея Пидугу
источник
0
ObjectMapper mapper = new ObjectMapper();

Здравствуй,

Когда я использую mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)

Мои значения объекта json приходят '' пустые на угловой странице в ответ

Решено только с помощью настроек ниже

mapper.setVisibility(mapper.getSerializationConfig().getDefaultVisibilityChecker().
withFieldVisibility(JsonAutoDetect.Visibility.ANY).withGetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withSetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withCreatorVisibility(JsonAutoDetect.Visibility.NONE));
Шахид Хуссейн Аббаси
источник
0

В моем случае мне не нужно было отключать его, мне пришлось поместить этот код поверх своего класса: (и это решило мою проблему)

    @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)//this is what was added
    @Value //this was there already
    @Builder//this was there already

public class NameOfClass {
     //some code in here.
}
AppEmmanuel
источник