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.