Ignoreeri Java ja Spring Boot Jacksoniga nullvälju

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 @Beannimega 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.

Ajatempel:

Veel alates Stackabus