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.