Jak wyłączyć fail_on_empty_beans w Jackson?

104

Korzystając z usługi Jackson 2.1, jak mogę wyłączyć to, fail_on_empty beansże komunikat o błędzie wydaje się żądać ode mnie wyłączenia?

Zakładam, że to po prostu najprostsza rzecz na świecie, ale do diabła jest późno i nie udało mi się znaleźć prostego samouczka ani niczego szczególnie oczywistego z api. SerializationFactory? Dlaczego mieliby uczynić to tak nieintuicyjnym, a następnie sprawić, by komunikat o błędzie wydawał się tak prosty?

Chociaż zrobić jak komunikat o błędzie, to znaczy, że jest lepiej niż NPE.

Zakładam, że istnieje sposób, aby to zrobić za pomocą adnotacji - ale nie chcę ich wcale używać do uproszczonej pracy, którą wykonuję!

bharal
źródło

Odpowiedzi:

128

Wydaje mi się, że możesz to zrobić na lekcjach lub globalnie.

W przypadku klasy spróbuj @JsonSerialize powyżej deklaracji klasy.

Oto jeden przykład dla twórcy map:

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)

Poniższe łącze StackOverflow zawiera również przykład projektu Spring.

W przypadku REST z Jersey nie pamiętam z głowy, ale wydaje mi się, że jest podobnie.


Kilka linków, które wykopałem: (zredagowałem pierwszy link z powodu zamknięcia Codehaus).

Pancakeo
źródło
Użyłem tego dzisiaj wcześniej, ma trochę więcej informacji, np. Automatyczne wykrywanie. stackoverflow.com/questions/4362104/…
Pancakeo
1
Czy możesz podać przykład, jak używać @JsonSerializedo wyłączania FAIL_ON_EMPTY_BEANSdeklaracji klasy?
tuk
2
Minęło już kilka lat :). To może pomóc: stackoverflow.com/questions/12162413/…
Pancakeo
Możesz też użyć metody wyłączającej klasy ObjectMapper, takiej jak „mapper.disable (SerializationFeature.FAIL_ON_EMPTY_BEANS)”
R Pidugu
47

Jeśli używasz Spring Boot, możesz ustawić następującą właściwość w pliku application.properties. spring.jackson.serialization.FAIL_ON_EMPTY_BEANS = false

abhishek jain
źródło
Tak. Rozwiązałem to.
Ojonugwa Jude Ochalifu
22

Możesz również uzyskać ten sam problem, jeśli twoja klasa nie zawiera żadnych publicznych metod / właściwości. Zwykle mam dedykowane DTO dla żądań i odpowiedzi API, zadeklarowane jako publiczne, ale w jednym przypadku zapomniałem również upublicznić metody - co spowodowało w pierwszej kolejności "pusty" bean.

RJStanford
źródło
13

Prawdopodobnie możesz również dodać do klasy adnotację, @JsonIgnoreProperties(ignoreUnknown=true)aby zignorować pola niezdefiniowane w klasie

AllDayAmazing
źródło
1
To nie zadziała, jeśli cała fasola jest faktycznie zerowa
maryoush
12

Jeśli chcesz uzyskać obiekt JSON bez dodatkowych pól - dodaj tę adnotację do swojej klasy, u mnie zadziałało idealnie.

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

Możesz również dodać ten wiersz do pliku application.properties, ale spowoduje to dodanie dodatkowego pola do pliku JSON.

spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false
user1913615
źródło
Próbowałem zwrócić JSON z wnętrza jednego z moich kontrolerów w mojej aplikacji REST na wiosnę i to naprawiło to dla mnie.
ninjasense,
Idealny sposób, jeśli masz pusty przedmiot!
Georgi Peev
3

Jeśli używasz org.codehaus.jackson.map.ObjectMapper, to pls. użyj następujących linii

mapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);
thangamanikasi
źródło
3

W Jersey Rest Services po prostu użyj adnotacji JacksonFeatures ...

@JacksonFeatures(serializationDisable = {SerializationFeature.FAIL_ON_EMPTY_BEANS})
public Response getSomething() {
    Object entity = doSomething();
    return Response.ok(entity).build();
}
mefistofeles78
źródło
1

W moim przypadku nie napisałem adnotacji @JsonProperty w jednym z pól, które powodowało ten błąd.

Wahib Ul Haq
źródło
1

Dodanie tutaj rozwiązania dla innego problemu, ale takiego, który objawia się tym samym błędem ... Zachowaj ostrożność podczas konstruowania json w locie (jako odpowiedzi API lub cokolwiek innego), aby uniknąć dosłownych podwójnych cudzysłowów w elementach łańcuchowych. Być może korzystasz z własnego, zniekształconego pliku json.

Kirk B.
źródło
1

Aby rozwiązać ten problem, skonfiguruj klasę JsonDataFormat jak poniżej

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

co jest prawie równoważne z,

mapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);
R Pidugu
źródło
0
ObjectMapper mapper = new ObjectMapper();

Cześć,

Kiedy używam mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)

Moje wartości obiektu json są puste w odpowiedzi na oznaczenie strony kątowej

Rozwiązany za pomocą tylko poniższych ustawień

mapper.setVisibility(mapper.getSerializationConfig().getDefaultVisibilityChecker().
withFieldVisibility(JsonAutoDetect.Visibility.ANY).withGetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withSetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withCreatorVisibility(JsonAutoDetect.Visibility.NONE));
Shahid Hussain Abbasi
źródło
0

W moim przypadku nie musiałem go wyłączać, raczej musiałem umieścić ten kod na szczycie mojej klasy: (i to rozwiązało mój problem)

    @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
źródło