Ignorer Null Fields med Jackson i Java og Spring Boot

Nullverdier oppstår mye i programvareutvikling, og riktig håndtering av null verdier kan gjøres om til en vitenskap i seg selv. Jackson er de-facto-biblioteket for serialisering og deserialisering av Java-objekter – og et vanlig scenario gjelder å serialisere objekter som har null felt.

I denne korte opplæringen tar vi en titt på hvordan du kan ignorere null-felt når du serialiserer en POJO med Jackson.

Endre ObjectMapper-innstillingene

Jacksons ObjectMapper er den sentrale API-en som kartlegger objekter til serialiserte verdier. Naturligvis kan du justere og tilpasse måten det fungerer på gjennom forskjellige flagg, hvorav ett er:

objectMapper.setSerializationInclusion(Include.NON_NULL);

Når du serialiserer med denne kartleggeren, vil egenskaper bare inkluderes hvis de ikke er null.

Dette setter flagget globalt for ethvert objekt som serialiseres med objectMapper forekomst. Hvis du jobber med Spring Boot, og ObjectMapperen den er avhengig av ikke er eksponert, kan du endre flagget i application.properties file:

spring.jackson.default-property-inclusion = non_null

Eller, hvis du bruker application.yml:

spring:
  jackson:
    default-property-inclusion: non_null

OBS: Eldre versjoner av Spring brukt spring.jackson.serialization-inclusion=non_null istedenfor spring.jackson.default-property-inclusion=non_null.

Alternativt kan du trekke tilbake og erstatte standarden ObjectMapper eksempel ved å registrere en ny @Primary @Bean, oppkalt objectMapper(), som overstyrer standardimplementeringen og tillater full tilpasning over forekomsten som vil bli brukt som standard ved serialisering og deserialisering:

@Bean
@Primary
public ObjectMapper objectMapper() {
    return new ObjectMapper()
      .setSerializationInclusion(JsonInclude.Include.NON_NULL);
}

Dette @Bean bør gå inn hvilken som helst fil som er merket med @Configuration annotering, og er ofte plassert enten i en spesialisert konfigurasjonsklasse eller hovedklassen til Spring Boot-applikasjonen.

Endre Jackson2ObjectMapperBuilder-forekomsten

Våren bruker HttpMessageConverters å konvertere mellom HTTP-meldinger og objekter. Standard omformere er ObjectMapper og XmlMapper forekomster instansiert via Jackson2ObjectMapperBuilder.

I stedet for manuelt å gi den primære ObjectMapper (erstatter den som er levert av byggherren), kan du instruere Spring on hvordan bygge objektkartleggeren i stedet. Dette lar Spring gjøre konfigurasjonene på høyt nivå uten at du tukler med objektene på lavere nivå, samtidig som den tilpasser måten den fungerer på. I tillegg kan du også tilpasse XmlMapper denne måten på en gang.

For å tilpasse byggherren, registrerer du en ny @Bean of Jackson2ObjectMapperBuilderCustomizer type, som tilpasser og returnerer byggherren:

@Bean
public Jackson2ObjectMapperBuilderCustomizer customBuilder() {
    return builder -> {
      builder.serializationInclusion(JsonInclude.Include.NON_NULL);
    }
}

@JsonInkluder merknad

I den andre enden av spekteret kan vi bruke merknader, som et lavkodealternativ! Merknader kan brukes på klassenivå eller metodenivå:

@JsonInclude(JsonInclude.Include.NON_NULL)

Dette lar deg tilpasse bare visse klasser, i stedet for den globale oppførselen til objektkartleggeren.

Sjekk ut vår praktiske, praktiske guide for å lære Git, med beste praksis, bransjeaksepterte standarder og inkludert jukseark. Slutt å google Git-kommandoer og faktisk lære den!

OBS: Fra og med Jackson 2.0 er merknadens verdi JsonInclude.Include.NON_NULL. For tidligere versjoner, bruk include=JsonSerialize.Inclusion.NON_NULL.

@JsonInkluder på klassenivå

Når du søker @JsonInclude på klassenivå strekker merknaden seg til alle gettere og settere:

@Entity(name="property")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Property implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private String id;

    @Column(name="transaction_type")
    private TransactionType transactionType;

    @Column(name="property_type")
    private PropertyType propertyType;
    
    
}

Ethvert gitt felt som har en null verdien blir ikke serialisert.

@JsonInkluder på metodenivå

Alternativt kan du bruke merknaden på metodenivå som det mest detaljerte alternativet:

@Entity(name="property")
public class Property implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private String id;

    @Column(name="transaction_type")
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private TransactionType transactionType;

    @Column(name="property_type")
    private PropertyType propertyType;
    
    
}

I dette utdraget – merknaden brukes bare på TransactionType feltet.

konklusjonen

I denne veiledningen har du lært hvordan du ignorerer null-felt i Jackson, med Java og Spring Boot. Dette kan oppnås globalt ved å erstatte det underliggende implisitte ObjectMapper forekomst og tilpasse oppførselen til den nye primærbønnen du registrerer.

Alternativt kan du tilpasse Jackson2ObjectMapperBuilder som bygger ObjectMapper for applikasjonen din i stedet for å erstatte den allerede bygde. For en lavkodeløsning – du kan endre spring.jackson.default-property-inclusion eiendom i egenskapsfilene dine.

Til slutt – du kan bruke @JsonInclude merknad på klassenivå eller metodenivå.

Tidstempel:

Mer fra Stackabuse