Come disabilito fail_on_empty_beans in Jackson?


99

Usando jackson 2.1, come faccio a disabilitare il fail_on_empty beansmessaggio di errore che sembra voler disabilitare?

Presumo che questa sia solo la cosa più semplice del mondo, ma diavolo è tardi e non sono stato in grado di trovare un semplice tutorial o qualcosa di particolarmente ovvio dal api. SerializationFactory? Perché dovrebbero renderlo così poco intuitivo e quindi far sembrare il messaggio di errore così semplice?

Anche se io faccio come il messaggio di errore, voglio dire, è meglio di un NPE.

Suppongo che ci sia un modo per farlo usando le annotazioni, ma non mi piace affatto usarle per il lavoro semplicistico che sto facendo!

Risposte:


124

Puoi farlo per classe o globalmente, credo.

Per per classe, prova @JsonSerialize sopra la dichiarazione di classe.

Per un mappatore, ecco un esempio:

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)

Il collegamento StackOverflow di seguito contiene anche un esempio per un progetto Spring.

Per REST with Jersey, non mi ricordo dalla parte superiore della mia testa, ma credo sia simile.


Un paio di collegamenti che ho scoperto: (modificato il primo collegamento a causa della chiusura di Codehaus)


L'ho usato oggi, ha qualche informazione in più, ad esempio il rilevamento automatico. stackoverflow.com/questions/4362104/...
Pancakeo

1
Puoi fare un esempio su come usare @JsonSerializeper disabilitare la FAIL_ON_EMPTY_BEANSdichiarazione di classe?
tuk

2
Sono passati alcuni anni :). Questo aiuto potrebbe: stackoverflow.com/questions/12162413/...
Pancakeo

Oppure puoi utilizzare il metodo di disabilitazione della classe ObjectMapper come "mapper.disable (SerializationFeature.FAIL_ON_EMPTY_BEANS)"
Reddeiah Pidugu

43

Se si utilizza Spring Boot, è possibile impostare la seguente proprietà nel file application.properties. spring.jackson.serialization.FAIL_ON_EMPTY_BEANS = false


22

Puoi anche ottenere lo stesso problema se la tua classe non contiene metodi / proprietà pubblici. Normalmente ho DTO dedicati per le richieste e le risposte API, dichiarate pubbliche, ma in un caso ho dimenticato di rendere pubblici anche i metodi, il che ha causato il bean "vuoto" in primo luogo.


13

Probabilmente puoi anche annotare la classe con @JsonIgnoreProperties(ignoreUnknown=true)per ignorare i campi non definiti nella classe


1
Questo non funzionerà se l'intero fagiolo è effettivamente nullo
maryoush

12

Se desideri ottenere un oggetto JSON senza campi aggiuntivi, aggiungi questa annotazione alla tua classe, ha funzionato perfettamente per me.

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

Puoi anche aggiungere questa riga nel tuo file application.properties, ma aggiungerà un campo extra al tuo JSON.

spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false

Stavo cercando di restituire JSON dall'interno di uno dei miei controller nella mia app REST con avvio a molla e questo lo ha risolto per me.
ninjasense

Il modo perfetto se hai un oggetto vuoto!
Georgi Peev

3

Se usi org.codehaus.jackson.map.ObjectMapper, allora pls. utilizzare le seguenti righe

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

2

In Jersey Rest Services basta usare l'annotazione JacksonFeatures ...

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

1

Nel mio caso, non ho scritto l'annotazione @JsonProperty in uno dei campi che causava questo errore.


1

Aggiunta qui una soluzione per un problema diverso, ma che si manifesta con lo stesso errore ... Fare attenzione quando si costruisce json al volo (come risposte api o altro) per evitare le virgolette letterali nei membri della stringa. Potresti consumare il tuo json malformato.


1

Per risolvere questo problema, configura la tua classe JsonDataFormat come di seguito

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

che è quasi equivalente a,

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

0
ObjectMapper mapper = new ObjectMapper();

Ciao,

Quando uso mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)

I valori del mio oggetto json vengono "vuoti" nella media angolare della pagina in risposta

Risolto con l'aiuto delle sole impostazioni di seguito

mapper.setVisibility(mapper.getSerializationConfig().getDefaultVisibilityChecker().
withFieldVisibility(JsonAutoDetect.Visibility.ANY).withGetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withSetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withCreatorVisibility(JsonAutoDetect.Visibility.NONE));

0

Nel mio caso non avevo bisogno di disabilitarlo, piuttosto ho dovuto mettere questo codice in cima alla mia classe: (e questo ha risolto il mio problema)

    @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.
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.