Ignoruj ​​Null Fields z Jacksonem w Javie i Spring Boot

Wartości null pojawiają się bardzo często przy tworzeniu oprogramowania i prawidłowej obsłudze null wartości można przekształcić w naukę samą w sobie. Jackson to de facto biblioteka służąca do serializacji i deserializacji obiektów Java — a typowy scenariusz dotyczy serializacji obiektów, które mają null Pola.

W tym krótkim samouczku przyjrzymy się, jak można ignorować pola null podczas serializacji POJO za pomocą Jacksona.

Zmiana ustawień ObjectMappera

ObjectMapper Jacksona to centralny interfejs API, który odwzorowuje obiekty na wartości serializowane. Oczywiście możesz dostosować i dostosować sposób działania za pomocą różnych flag, z których jedna to:

objectMapper.setSerializationInclusion(Include.NON_NULL);

Podczas serializacji za pomocą tego programu mapującego właściwości będą uwzględniane tylko wtedy, gdy mają wartość inną niż null.

To ustawia flagę na całym świecie dla dowolnego obiektu serializowanego za pomocą objectMapper instancja. Jeśli pracujesz z Spring Boot, a ObjectMapper, na którym polega, nie jest widoczny, możesz zmienić flagę w application.properties file:

spring.jackson.default-property-inclusion = non_null

Lub, jeśli używasz application.yml:

spring:
  jackson:
    default-property-inclusion: non_null

Uwaga: Używane starsze wersje Spring spring.jackson.serialization-inclusion=non_null zamiast spring.jackson.default-property-inclusion=non_null.

Alternatywnie możesz odkleić i zastąpić domyślne ObjectMapper instancję rejestrując nowy @Primary @Bean, o imieniu objectMapper(), która zastępuje domyślną implementację i umożliwia pełne dostosowanie instancji, która będzie używana domyślnie podczas serializacji i deserializacji:

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

To zdjęcie @Bean powinien wejść w dowolny plik z adnotacjami @Configuration adnotacji i często znajduje się w wyspecjalizowanej klasie konfiguracyjnej lub w głównej klasie aplikacji Spring Boot.

Zmiana wystąpienia Jackson2ObjectMapperBuilder

Wiosna wykorzystuje HttpMessageConverters do konwersji między wiadomościami HTTP a obiektami. Domyślne konwertery to ObjectMapper i XmlMapper instancje tworzone przez Jackson2ObjectMapperBuilder.

Zamiast ręcznie podawać podstawowy ObjectMapper (zastępując ten dostarczony przez konstruktora), możesz poinstruować Spring na jak zbudować zamiast tego obiekt mapujący. Dzięki temu Spring może wykonywać konfiguracje wysokiego poziomu bez manipulowania obiektami niższego poziomu, jednocześnie dostosowując sposób działania. Dodatkowo możesz również dostosować XmlMapper w ten sposób za jednym zamachem.

Aby dostosować kreator, rejestrujesz nowy @Bean of Jackson2ObjectMapperBuilderCustomizer typ, który dostosowuje i zwraca konstruktora:

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

@JsonInclude Adnotacja

Na drugim końcu spektrum możemy używać adnotacji jako alternatywy o niskim kodzie! Adnotacje można stosować na poziomie klasy lub metody:

@JsonInclude(JsonInclude.Include.NON_NULL)

Pozwala to na dostosowanie tylko niektórych klas, zamiast globalnego zachowania obiektu mapującego.

Zapoznaj się z naszym praktycznym, praktycznym przewodnikiem dotyczącym nauki Git, zawierającym najlepsze praktyki, standardy przyjęte w branży i dołączoną ściągawkę. Zatrzymaj polecenia Google Git, a właściwie uczyć się to!

Uwaga: Od wersji Jackson 2.0 wartość adnotacji wynosi JsonInclude.Include.NON_NULL. W przypadku wcześniejszych wersji użyj include=JsonSerialize.Inclusion.NON_NULL.

@JsonInclude na poziomie klasy

Po złożeniu wniosku @JsonInclude na poziomie klasy adnotacja rozciąga się na wszystkie gettery i settery:

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

Dowolne pole, które ma null wartość nie będzie serializowana.

@JsonInclude na poziomie metody

Alternatywnie możesz zastosować adnotację na poziomie metody jako najbardziej szczegółową opcję:

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

W tym fragmencie — adnotacja jest stosowana tylko do TransactionType pole.

Wnioski

W tym przewodniku dowiedziałeś się, jak ignorować pola null w Jackson za pomocą Java i Spring Boot. Można to osiągnąć globalnie, zastępując ukryty ukryty ObjectMapper wystąpienie i dostosowanie zachowania nowego zarejestrowanego ziarna podstawowego.

Alternatywnie możesz dostosować Jackson2ObjectMapperBuilder który buduje ObjectMapper dla Twojej aplikacji zamiast zastępowania już zbudowanej. W przypadku rozwiązania low-code – możesz zmienić spring.jackson.default-property-inclusion właściwości w plikach właściwości.

Wreszcie – możesz użyć @JsonInclude adnotacja na poziomie klasy lub na poziomie metody.

Znak czasu:

Więcej z Nadużycie stosu