Ignorer Null Fields med Jackson i Java og Spring Boot

Nullværdier opstår meget i softwareudvikling, og korrekt håndtering af null værdier kan gøres til en videnskab i sig selv. Jackson er de-facto-biblioteket for serialisering og deserialisering af Java-objekter - og et almindeligt scenarie vedrører serialisering af objekter, der har null felter.

I denne korte vejledning tager vi et kig på, hvordan du kan ignorere nulfelter, når du serialiserer en POJO med Jackson.

Ændring af ObjectMapper-indstillingerne

Jacksons ObjectMapper er den centrale API, der kortlægger objekter til serialiserede værdier. Du kan naturligvis justere og tilpasse den måde, det fungerer på gennem forskellige flag, hvoraf et er:

objectMapper.setSerializationInclusion(Include.NON_NULL);

Når du serialiserer med denne mapper, vil egenskaber kun blive inkluderet, hvis de ikke er nul.

Dette sætter flaget globalt for ethvert objekt, der serialiseres med objectMapper eksempel. Hvis du arbejder med Spring Boot, og den ObjectMapper, den er afhængig af, ikke vises, kan du ændre flaget i application.properties fil:

spring.jackson.default-property-inclusion = non_null

Eller, hvis du bruger application.yml:

spring:
  jackson:
    default-property-inclusion: non_null

Bemærk: Ældre versioner af Spring brugt spring.jackson.serialization-inclusion=non_null i stedet for spring.jackson.default-property-inclusion=non_null.

Alternativt kan du trække tilbage og erstatte standarden ObjectMapper eksempel ved at registrere en ny @Primary @BeanOpkaldt objectMapper(), som tilsidesætter standardimplementeringen og tillader fuld tilpasning over den instans, der som standard bruges ved serialisering og deserialisering:

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

Denne @Bean skal gå ind enhver fil der er kommenteret med @Configuration annotation, og er ofte placeret enten i en specialiseret konfigurationsklasse eller hovedklassen i Spring Boot-applikationen.

Ændring af Jackson2ObjectMapperBuilder-forekomsten

Foråret bruger HttpMessageConverters at konvertere mellem HTTP-meddelelser og objekter. Standardkonverterne er ObjectMapper , XmlMapper instanser instansieret via Jackson2ObjectMapperBuilder.

I stedet for manuelt at levere det primære ObjectMapper (erstatter den, der er leveret af bygherren), kan du instruere Spring på hvordan man bygger objektkortlæggeren i stedet. Dette giver Spring mulighed for at udføre sine konfigurationer på højt niveau, uden at du manipulerer med objekter på lavere niveau, mens du stadig tilpasser den måde, det fungerer på. Derudover kan du også tilpasse XmlMapper denne måde på én gang.

For at tilpasse bygherren, registrerer du en ny @Bean of Jackson2ObjectMapperBuilderCustomizer type, som tilpasser og returnerer builder:

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

@JsonInkluder annotering

I den anden ende af spektret kan vi bruge annoteringer, som et lavkode-alternativ! Annoteringer kan anvendes på klasseniveau eller metodeniveau:

@JsonInclude(JsonInclude.Include.NON_NULL)

Dette giver dig mulighed for kun at tilpasse bestemte klasser i stedet for den globale opførsel af objektkortlæggeren.

Tjek vores praktiske, praktiske guide til at lære Git, med bedste praksis, brancheaccepterede standarder og inkluderet snydeark. Stop med at google Git-kommandoer og faktisk lærer det!

Bemærk: Fra Jackson 2.0 er annotationens værdi JsonInclude.Include.NON_NULL. For tidligere versioner, brug include=JsonSerialize.Inclusion.NON_NULL.

@JsonInkluder på klasseniveau

Når du anvender @JsonInclude på klasseniveau strækker annotationen sig til alle gettere og sættere:

@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 givet felt, der har en null værdien bliver ikke serialiseret.

@JsonInclude på metodeniveau

Alternativt kan du anvende annoteringen på metodeniveau som den mest granulære mulighed:

@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 uddrag - annoteringen anvendes kun på TransactionType felt.

Konklusion

I denne guide har du lært, hvordan du ignorerer nulfelter i Jackson med Java og Spring Boot. Dette kan opnås globalt ved at erstatte det underliggende implicitte ObjectMapper instans og tilpasse adfærden for den nye primære bean, du registrerer.

Alternativt kan du tilpasse Jackson2ObjectMapperBuilder der bygger ObjectMapper til din applikation i stedet for at erstatte den allerede byggede. For en lavkodeløsning – du kan ændre spring.jackson.default-property-inclusion ejendom i dine ejendomsfiler.

Endelig – du kan bruge @JsonInclude anmærkning på klasseniveau eller metodeniveau.

Tidsstempel:

Mere fra Stablemisbrug