Як вимкнути fail_on_empty_beans у Джексоні?


99

Як використовувати jackson 2.1, як мені вимкнути те, fail_on_empty beansщо повідомлення про помилку, здається, хоче, щоб я його відключив?

Я припускаю, що це просто найпростіша річ у світі, але, пекло, це пізно, і я не зміг знайти простий підручник чи щось особливо очевидне з api. SerializationFactory? Чому вони роблять це таким неінтуїтивним, а потім роблять повідомлення про помилку таким простим?

Хоча я робити , як повідомлення про помилку, я маю в виду, що це краще , ніж NPE.

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

Відповіді:


124

Я вважаю, це можна зробити для кожного класу або в усьому світі.

Для кожного класу спробуйте @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.

Що стосується REST з Джерсі, то я не пам’ятаю, що маю голову, але я вважаю, що це схоже.


Кілька посилань, які я відкопав: (відредаговано 1-е посилання через вимкнення Codehaus).


Я використовував цей раніше сьогодні, має трохи більше інформації, наприклад, автоматичне виявлення. stackoverflow.com/questions/4362104 / ...
Pancakeo

1
Чи можете ви навести приклад того, як використовувати @JsonSerializeдля відключення FAIL_ON_EMPTY_BEANSоголошення класу?
тук

2
Пройшло кілька років :). Це може допомогти: stackoverflow.com/questions/12162413 / ...
Pancakeo

Або ви можете використовувати метод відключення класу ObjectMapper, наприклад "mapper.disable (SerializationFeature.FAIL_ON_EMPTY_BEANS)"
Reddeiah Pidugu

43

Якщо ви використовуєте Spring Boot, ви можете встановити наступну властивість у файлі application.properties. spring.jackson.serialization.FAIL_ON_EMPTY_BEANS = false


22

Ви також можете отримати ту саму проблему, якщо ваш клас не містить жодних загальнодоступних методів / властивостей. Зазвичай у мене є спеціальні DTO для запитів та відповідей API, які я оголошую загальнодоступними, але в одному випадку забув також опублікувати методи, що спричинило спочатку "порожній" бін.


13

Ви також можете, можливо, анотувати клас, @JsonIgnoreProperties(ignoreUnknown=true)щоб ігнорувати поля, невизначені в класі


1
Це не спрацює, якщо вся квасоля насправді нульова
maryoush

12

Якщо ви хочете отримати об’єкт JSON без зайвих полів - додайте цю анотацію до свого класу, вона для мене ідеально працювала.

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

Ви також можете додати у файл application.properties цей рядок, але він додасть додаткове поле до вашого JSON.

spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false

Я намагався повернути JSON з одного з моїх контролерів у моєму додатку spring-boot REST, і це виправило це для мене.
ninjasense

Ідеальний спосіб, якщо у вас порожній предмет!
Георгій Пеєв

3

Якщо ви використовуєте org.codehaus.jackson.map.ObjectMapper, то pls. використовуйте наступні рядки

mapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);

2

У послугах відпочинку Джерсі просто використовуйте анотацію JacksonFeatures ...

@JacksonFeatures(serializationDisable = {SerializationFeature.FAIL_ON_EMPTY_BEANS})
public Response getSomething() {
    Object entity = doSomething();
    return Response.ok(entity).build();
}

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.
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.