Hagyja figyelmen kívül a null mezőket Jacksonnal a Java és a Spring Boot rendszerben

A szoftverfejlesztésben és a megfelelő kezelésben a nullértékek sokat merülnek fel null az értékek önmagukban tudománnyá változhatnak. A Jackson a Java objektumok szerializálásának és deszerializálásának de facto könyvtára – és egy gyakori forgatókönyv az olyan objektumok szerializálására vonatkozik, amelyek null mezők.

Ebben a rövid oktatóanyagban azt nézzük meg, hogyan hagyhatja figyelmen kívül a null mezőket, amikor Jacksonnal szerializál egy POJO-t.

Az ObjectMapper beállításainak módosítása

A Jackson ObjectMapper a központi API, amely az objektumokat soros értékekre képezi le. Természetesen különféle jelzők segítségével módosíthatja és testreszabhatja a működését, amelyek közül az egyik:

objectMapper.setSerializationInclusion(Include.NON_NULL);

Ha ezzel a leképezővel szerializálja, a tulajdonságok csak akkor kerülnek bele, ha nem nullák.

Ez állítja be a zászlót globálisan minden olyan objektumhoz, amelyet a objectMapper példa. Ha a Spring Boot-tal dolgozik, és az ObjectMapper, amelyre támaszkodik, nincs kitéve, módosíthatja a jelzőt a application.properties file:

spring.jackson.default-property-inclusion = non_null

Vagy ha használod application.yml:

spring:
  jackson:
    default-property-inclusion: non_null

Jegyzet: A Spring régebbi verziói használtak spring.jackson.serialization-inclusion=non_null helyett spring.jackson.default-property-inclusion=non_null.

Alternatív megoldásként lehúzhatja az alapértelmezettet ObjectMapper például új regisztrálásával @Primary @Bean, nevezett objectMapper(), amely felülírja az alapértelmezett megvalósítást, és lehetővé teszi a teljes testreszabást a példányon, amely alapértelmezés szerint a szerializáláskor és a deszerializáláskor használatos:

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

Ezt @Bean bele kellene menni bármilyen fájlt amely a következővel van megjelölve @Configuration megjegyzés, és gyakran egy speciális konfigurációs osztályban vagy a Spring Boot alkalmazás fő osztályában található.

A Jackson2ObjectMapperBuilder példány módosítása

A tavasz használja a HttpMessageConverters a HTTP-üzenetek és objektumok közötti konvertáláshoz. Az alapértelmezett konverterek a ObjectMapper és a XmlMapper a példányokon keresztül példányosított példányok Jackson2ObjectMapperBuilder.

Az elsődleges megadása helyett ObjectMapper (az építtető által biztosított helyett), utasíthatja a Spring on hogyan kell építeni helyette az objektumleképezőt. Ez lehetővé teszi a Spring számára a magas szintű konfigurációk elvégzését anélkül, hogy az alacsonyabb szintű objektumokat manipulálná, miközben továbbra is testreszabhatja a működését. Ezenkívül személyre szabhatja a XmlMapper így egy menetben.

Az építő testreszabásához újat kell regisztrálnia @Bean of Jackson2ObjectMapperBuilderCustomizer típus, amely testreszabja és visszaadja az építőt:

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

@JsonInclude megjegyzés

A spektrum másik végén az annotációkat használhatjuk alacsony kódú alternatívaként! A megjegyzések osztály- vagy metódusszinten alkalmazhatók:

@JsonInclude(JsonInclude.Include.NON_NULL)

Ez csak bizonyos osztályok testreszabását teszi lehetővé az objektumleképező globális viselkedése helyett.

Tekintse meg gyakorlatias, gyakorlati útmutatónkat a Git tanulásához, amely tartalmazza a bevált gyakorlatokat, az iparág által elfogadott szabványokat és a mellékelt csalólapot. Hagyd abba a guglizást a Git parancsokkal, és valójában tanulni meg!

Jegyzet: A Jackson 2.0-tól kezdve a kommentár értéke: JsonInclude.Include.NON_NULL. Korábbi verziók esetén használja include=JsonSerialize.Inclusion.NON_NULL.

@JsonInclude osztályszinten

Ha alkalmazza @JsonInclude osztályszinten a megjegyzés kiterjed az összes getterre és setterre:

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

Bármely adott mező, amely rendelkezik a null az érték nem lesz sorozatos.

@JsonInclude a módszer szintjén

Alternatív megoldásként a megjegyzést módszerszinten is alkalmazhatja a legrészletesebb lehetőségként:

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

Ebben a részletben – a megjegyzés csak a TransactionType mező.

Következtetés

Ebből az útmutatóból megtanulta, hogyan lehet figyelmen kívül hagyni a null mezőket Jacksonban Java és Spring Boot segítségével. Ez globálisan elérhető a mögöttes implicit felváltásával ObjectMapper példány és a regisztrált új elsődleges komponens viselkedésének testreszabása.

Alternatív megoldásként testreszabhatja a Jackson2ObjectMapperBuilder amely építi a ObjectMapper alkalmazásához, ahelyett, hogy lecserélné a már megépítettet. Alacsony kódú megoldáshoz – módosíthatja a spring.jackson.default-property-inclusion tulajdonság fájljaiban.

Végül – használhatja a @JsonInclude osztályszintű vagy metódusszintű annotáció.

Időbélyeg:

Még több Stackabus