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

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


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


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.


13

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


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

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

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();
}

1

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


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.


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

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

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.
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.