Nullväärtused tekivad palju tarkvaraarenduses ja selle õiges käsitlemises null
väärtusi saab muuta teaduseks omaette. Jackson on Java-objektide serialiseerimiseks ja deserialiseerimiseks mõeldud de facto raamatukogu – ja tavaline stsenaarium puudutab objektide serialiseerimist, millel on null
valdkondades.
Selles lühikeses õpetuses vaatleme, kuidas saate Jacksoniga POJO-seeriamisel nullvälju ignoreerida.
ObjectMapperi sätete muutmine
Jacksoni ObjectMapper on keskne API, mis kaardistab objektid jadaväärtustega. Loomulikult saate selle toimimist reguleerida ja kohandada erinevate lippude kaudu, millest üks on:
objectMapper.setSerializationInclusion(Include.NON_NULL);
Selle kaardistajaga serialiseerimisel kaasatakse atribuudid ainult siis, kui need ei ole nullid.
See paneb lipu paika ülemaailmselt mis tahes objekti jaoks, mida seeriastatakse objectMapper
näiteks. Kui töötate Spring Bootiga ja ObjectMapper, millele see tugineb, pole avatud, saate lippu muuta application.properties
faili:
spring.jackson.default-property-inclusion = non_null
Või kui kasutate application.yml
:
spring:
jackson:
default-property-inclusion: non_null
Märge: Kasutatud Spring vanemaid versioone spring.jackson.serialization-inclusion=non_null
asemel spring.jackson.default-property-inclusion=non_null
.
Teise võimalusena võite vaikeväärtuse asendada ObjectMapper
näiteks uue registreerimisega @Primary
@Bean
nimega objectMapper()
, mis alistab vaikerakenduse ja võimaldab täielikku kohandamist eksemplari üle, mida kasutatakse serialiseerimisel ja deserialiseerimisel vaikimisi:
@Bean
@Primary
public ObjectMapper objectMapper() {
return new ObjectMapper()
.setSerializationInclusion(JsonInclude.Include.NON_NULL);
}
see @Bean
peaks sisse minema mis tahes fail mis on märgistatud @Configuration
annotatsioon ja see asub sageli kas spetsiaalses konfiguratsiooniklassis või Spring Booti rakenduse põhiklassis.
Jackson2ObjectMapperBuilderi eksemplari muutmine
Kevad kasutab HttpMessageConverters
HTTP-sõnumite ja objektide teisendamiseks. Vaikemuundurid on ObjectMapper
ja XmlMapper
vahendusel instantseeritud juhtumid Jackson2ObjectMapperBuilder
.
Selle asemel, et anda esmane käsitsi ObjectMapper
(asendab ehitaja poolt pakutavat), saate Kevade juhendada kuidas ehitada selle asemel objekti kaardistaja. See võimaldab Springil teha oma kõrgetasemelisi konfiguratsioone, ilma et peaksite madalama taseme objekte rikkuma, kohandades samal ajal selle toimimist. Lisaks saate ka kohandada XmlMapper
seda teed ühe hooga.
Ehitaja kohandamiseks registreerite uue @Bean
of Jackson2ObjectMapperBuilderCustomizer
tüüp, mis kohandab ja tagastab ehitaja:
@Bean
public Jackson2ObjectMapperBuilderCustomizer customBuilder() {
return builder -> {
builder.serializationInclusion(JsonInclude.Include.NON_NULL);
}
}
@JsonInclude märkus
Spektri teises otsas saame madala koodiga alternatiivina kasutada annotatsioone! Märkusi saab rakendada klassi või meetodi tasemel:
@JsonInclude(JsonInclude.Include.NON_NULL)
See võimaldab teil kohandada ainult teatud klasse, mitte objektide kaardistaja globaalset käitumist.
Tutvuge meie praktilise ja praktilise Giti õppimise juhendiga, mis sisaldab parimaid tavasid, tööstusharus aktsepteeritud standardeid ja kaasas olevat petulehte. Lõpetage Giti käskude guugeldamine ja tegelikult õppima seda!
Märge: Jackson 2.0 seisuga on annotatsiooni väärtus JsonInclude.Include.NON_NULL
. Varasemate versioonide puhul kasutage include=JsonSerialize.Inclusion.NON_NULL
.
@JsonInclude klassi tasemel
Kui kandideerite @JsonInclude
klassi tasemel laieneb märkus kõigile hankijatele ja seadjatele:
@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;
}
Iga väli, millel on a null
väärtust ei jada.
@JsonInclude meetodi tasemel
Teise võimalusena saate annotatsiooni kõige üksikasjalikuma valikuna rakendada meetodi tasemel.
@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;
}
Selles lõigus – annotatsioon rakendatakse ainult TransactionType
valdkonnas.
Järeldus
Sellest juhendist õppisite, kuidas Jacksonis Java ja Spring Booti puhul nullvälju ignoreerida. Seda on võimalik saavutada globaalselt, asendades selle aluseks oleva kaudse ObjectMapper
eksemplari ja uue registreeritava esmase oa käitumise kohandamine.
Teise võimalusena saate kohandada Jackson2ObjectMapperBuilder
mis ehitab üles ObjectMapper
juba ehitatud rakenduse asemel. Madala koodiga lahenduse jaoks saate muuta spring.jackson.default-property-inclusion
atribuut teie atribuutide failides.
Lõpuks - saate kasutada @JsonInclude
annotatsioon klassi või meetodi tasemel.