Ohita nollakentät Jacksonin kanssa Javassa ja Spring Bootissa

Nolla-arvot syntyvät paljon ohjelmistokehityksessä ja niiden asianmukaisessa käsittelyssä null arvot voidaan muuttaa tieteeksi sinänsä. Jackson on de facto -kirjasto Java-objektien serialisointiin ja deserialisointiin – ja yleinen skenaario koskee sellaisten objektien sarjoittamista, joissa on null kentät.

Tässä lyhyessä opetusohjelmassa tarkastellaan, kuinka voit jättää huomioimatta nollakentät, kun sarjoit POJO:n Jacksonin kanssa.

ObjectMapperin asetusten muuttaminen

Jacksonin ObjectMapper on keskeinen API, joka kartoittaa objektit sarjoitettuihin arvoihin. Luonnollisesti voit säätää ja mukauttaa sen toimintaa eri lippujen avulla, joista yksi on:

objectMapper.setSerializationInclusion(Include.NON_NULL);

Kun sarjoitetaan tällä kartoittajalla, ominaisuudet otetaan mukaan vain, jos ne eivät ole nolla-arvoja.

Tämä asettaa lipun maailmanlaajuisesti mille tahansa objektille, joka sarjoitetaan objectMapper ilmentymä. Jos työskentelet Spring Bootin kanssa, eikä ObjectMapper, johon se luottaa, ei ole esillä, voit muuttaa lippua application.properties tiedosto:

spring.jackson.default-property-inclusion = non_null

Tai jos käytät application.yml:

spring:
  jackson:
    default-property-inclusion: non_null

Huomautus: Kevään vanhempia versioita käytetty spring.jackson.serialization-inclusion=non_null sijasta spring.jackson.default-property-inclusion=non_null.

Vaihtoehtoisesti voit irrottaa takaisin oletusasetuksen ObjectMapper esimerkiksi rekisteröimällä uusi @Primary @Bean, nimeltään objectMapper(), joka ohittaa oletustoteutuksen ja sallii täyden mukauttamisen ilmentymässä, jota käytetään oletuksena sarjoitettaessa ja sarjoitettaessa:

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

Tämä @Bean pitäisi mennä sisään mikä tahansa tiedosto joka on merkitty @Configuration huomautus, ja se sijaitsee usein joko erikoiskonfiguraatioluokassa tai Spring Boot -sovelluksen pääluokassa.

Jackson2ObjectMapperBuilder-instanssin muuttaminen

Kevät käyttää HttpMessageConverters muuntaa HTTP-viestien ja objektien välillä. Oletusmuuntimet ovat ObjectMapper ja XmlMapper -sovelluksen kautta instantoidut tapaukset Jackson2ObjectMapperBuilder.

Sen sijaan, että antaisit ensisijaisen manuaalisesti ObjectMapper (korvaa rakentajan toimittaman), voit ohjata Spring päälle miten rakentaa sen sijaan objektikartoittaja. Tämän ansiosta Spring voi tehdä korkean tason konfiguraatioita ilman, että joudut peukaloimaan alemman tason objekteja, samalla kun muokkaat sen toimintaa. Lisäksi voit myös mukauttaa XmlMapper tällä tavalla yhdellä kertaa.

Mukautaksesi rakentajaa, rekisteröit uuden @Bean of Jackson2ObjectMapperBuilderCustomizer tyyppi, joka mukauttaa ja palauttaa rakentajan:

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

@JsonInclude Annotation

Toisessa päässä voimme käyttää annotaatioita alhaisen koodin vaihtoehtona! Huomautuksia voidaan käyttää luokka- tai menetelmätasolla:

@JsonInclude(JsonInclude.Include.NON_NULL)

Tämän avulla voit mukauttaa vain tiettyjä luokkia objektikartoittajan yleisen toiminnan sijaan.

Tutustu käytännönläheiseen, käytännölliseen Gitin oppimisoppaaseemme, jossa on parhaat käytännöt, alan hyväksymät standardit ja mukana tuleva huijauslehti. Lopeta Git-komentojen googlailu ja oikeastaan oppia se!

Huomautus: Jackson 2.0:sta lähtien merkinnän arvo on JsonInclude.Include.NON_NULL. Käytä aiemmissa versioissa include=JsonSerialize.Inclusion.NON_NULL.

@JsonInclude luokkatasolla

Kun haet @JsonInclude luokkatasolla huomautus ulottuu kaikkiin saajiin ja asettajiin:

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

Mikä tahansa kenttä, jolla on a null arvoa ei sarjoiteta.

@JsonInclude menetelmätasolla

Vaihtoehtoisesti voit käyttää merkintää menetelmätasolla tarkimpana vaihtoehtona:

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

Tässä katkelmassa merkintä koskee vain TransactionType ala.

Yhteenveto

Tässä oppaassa olet oppinut sivuuttamaan nollakentät Jacksonissa Javalla ja Spring Bootilla. Tämä voidaan saavuttaa maailmanlaajuisesti korvaamalla taustalla oleva implisiittinen ObjectMapper esimerkki ja mukauttamalla rekisteröimäsi uuden ensisijaisen bean toimintaa.

Vaihtoehtoisesti voit mukauttaa Jackson2ObjectMapperBuilder joka rakentaa ObjectMapper sovelluksellesi sen sijaan, että korvaat jo valmiin. Matalakoodiratkaisua varten voit muuttaa spring.jackson.default-property-inclusion ominaisuustiedostoissasi.

Lopuksi – voit käyttää @JsonInclude huomautus luokka- tai menetelmätasolla.

Aikaleima:

Lisää aiheesta Stackabus