Negeer nulvelden met Jackson in Java en Spring Boot

Null-waarden komen veel voor bij softwareontwikkeling en de juiste afhandeling van null waarden kunnen worden omgezet in een wetenschap op zich. Jackson is de feitelijke bibliotheek voor serialisatie en deserialisatie van Java-objecten - en een veelvoorkomend scenario heeft betrekking op het serialiseren van objecten die null velden.

In deze korte zelfstudie bekijken we hoe u null-velden kunt negeren bij het serialiseren van een POJO met Jackson.

De ObjectMapper-instellingen wijzigen

Jackson's ObjectMapper is de centrale API die objecten toewijst aan geserialiseerde waarden. Natuurlijk kunt u de manier waarop het werkt aanpassen en aanpassen via verschillende vlaggen, waaronder:

objectMapper.setSerializationInclusion(Include.NON_NULL);

Bij het serialiseren met deze mapper worden eigenschappen alleen opgenomen als ze niet-null zijn.

Dit zet de vlag wereldwijd voor elk object dat wordt geserialiseerd met de objectMapper voorbeeld. Als u met Spring Boot werkt en de ObjectMapper waarop deze vertrouwt niet zichtbaar is, kunt u de vlag in de application.properties file:

spring.jackson.default-property-inclusion = non_null

Of, als u gebruikt application.yml:

spring:
  jackson:
    default-property-inclusion: non_null

Opmerking: Oudere versies van Spring gebruikt spring.jackson.serialization-inclusion=non_null in plaats van spring.jackson.default-property-inclusion=non_null.

Als alternatief kunt u de standaard verwijderen ObjectMapper bijvoorbeeld door een nieuwe . te registreren @Primary @Bean, Genaamd objectMapper(), die de standaardimplementatie overschrijft en volledige aanpassing mogelijk maakt over de instantie die standaard wordt gebruikt bij het serialiseren en deserialiseren:

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

Deze @Bean zou moeten ingaan op elk bestand dat is geannoteerd met de @Configuration annotatie, en bevindt zich vaak in een gespecialiseerde configuratieklasse of de hoofdklasse van de Spring Boot-toepassing.

De Jackson2ObjectMapperBuilder-instantie wijzigen

De lente gebruikt de HttpMessageConverters om te converteren tussen HTTP-berichten en objecten. De standaard converters zijn de ObjectMapper en XmlMapper instanties die zijn geรฏnstantieerd via de Jackson2ObjectMapperBuilder.

In plaats van handmatig de primaire te verstrekken ObjectMapper (ter vervanging van degene die door de bouwer is geleverd), kunt u Spring instrueren op hoe te bouwen de objectmapper in plaats daarvan. Hierdoor kan Spring zijn configuraties op hoog niveau uitvoeren zonder dat u knoeit met de objecten op een lager niveau, terwijl de manier waarop het werkt nog steeds wordt aangepast. Daarnaast kunt u ook de XmlMapper op deze manier in รฉรฉn keer.

Om de bouwer aan te passen, registreert u een nieuwe @Bean of Jackson2ObjectMapperBuilderCustomizer type, dat de builder aanpast en retourneert:

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

@JsonInclude-annotatie

Aan de andere kant van het spectrum kunnen we annotaties gebruiken als een low-code alternatief! Annotaties kunnen worden toegepast op klasse- of methodeniveau:

@JsonInclude(JsonInclude.Include.NON_NULL)

Hierdoor kunt u alleen bepaalde klassen aanpassen, in plaats van het algemene gedrag van de objectmapper.

Bekijk onze praktische, praktische gids voor het leren van Git, met best-practices, door de industrie geaccepteerde normen en bijgevoegd spiekbriefje. Stop met Googlen op Git-commando's en eigenlijk leren het!

Opmerking: Vanaf Jackson 2.0 is de waarde van de annotatie JsonInclude.Include.NON_NULL. Gebruik voor eerdere versies include=JsonSerialize.Inclusion.NON_NULL.

@JsonInclude op klasniveau

Wanneer je solliciteert @JsonInclude op klasseniveau strekt de annotatie zich uit tot alle getters en setters:

@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;
    
    
}

Elk gegeven veld met een null waarde wordt niet geserialiseerd.

@JsonInclude op methodeniveau

Als alternatief kunt u de annotatie op methodeniveau toepassen als de meest gedetailleerde optie:

@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;
    
    
}

In dit fragment wordt de annotatie alleen toegepast op de TransactionType veld.

Conclusie

In deze handleiding heb je geleerd hoe je null-velden in Jackson negeert, met Java en Spring Boot. Dit kan wereldwijd worden bereikt door de onderliggende impliciete ObjectMapper instantie en het aanpassen van het gedrag van de nieuwe primaire bean die u registreert.

Als alternatief kunt u de Jackson2ObjectMapperBuilder dat bouwt de ObjectMapper voor uw toepassing in plaats van de reeds gebouwde te vervangen. Voor een low-code oplossing โ€“ u kunt de spring.jackson.default-property-inclusion eigenschap in uw eigenschappenbestanden.

Tot slot โ€“ u kunt de @JsonInclude annotatie op klas- of methodeniveau.

Tijdstempel:

Meer van Stapelmisbruik