Ignorieren Sie Nullfelder mit Jackson in Java und Spring Boot

Nullwerte treten häufig in der Softwareentwicklung und bei der richtigen Handhabung auf null Werte können zu einer Wissenschaft für sich werden. Jackson ist die De-facto-Bibliothek für die Serialisierung und Deserialisierung von Java-Objekten – und ein gängiges Szenario bezieht sich auf die Serialisierung von Objekten mit null Felder.

In diesem kurzen Tutorial sehen wir uns an, wie Sie Nullfelder ignorieren können, wenn Sie ein POJO mit Jackson serialisieren.

Ändern der ObjectMapper-Einstellungen

Jacksons ObjectMapper ist die zentrale API, die Objekte auf serialisierte Werte abbildet. Natürlich können Sie die Funktionsweise durch verschiedene Flags anpassen und anpassen, von denen eines ist:

objectMapper.setSerializationInclusion(Include.NON_NULL);

Beim Serialisieren mit diesem Mapper werden Eigenschaften nur dann eingeschlossen, wenn sie nicht null sind.

Damit wird das Flag gesetzt verändern für jedes Objekt, das mit serialisiert wird objectMapper Beispiel. Wenn Sie mit Spring Boot arbeiten und der ObjectMapper, auf den es sich stützt, nicht angezeigt wird, können Sie das Flag in der ändern application.properties Datei:

spring.jackson.default-property-inclusion = non_null

Oder, wenn Sie verwenden application.yml:

spring:
  jackson:
    default-property-inclusion: non_null

Hinweis: Ältere Versionen von Spring verwendet spring.jackson.serialization-inclusion=non_null statt spring.jackson.default-property-inclusion=non_null.

Alternativ können Sie den Standard zurückziehen und ersetzen ObjectMapper Beispiel durch die Registrierung eines neuen @Primary @Bean, Mit dem Namen objectMapper(), die die Standardimplementierung überschreibt und eine vollständige Anpassung der Instanz ermöglicht, die standardmäßig beim Serialisieren und Deserialisieren verwendet wird:

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

Dieser @Bean sollte hineingehen jede Datei das ist mit dem kommentiert @Configuration Anmerkung und befindet sich häufig entweder in einer spezialisierten Konfigurationsklasse oder in der Hauptklasse der Spring Boot-Anwendung.

Ändern der Jackson2ObjectMapperBuilder-Instanz

Der Frühling nutzt die HttpMessageConverters um zwischen HTTP-Nachrichten und Objekten zu konvertieren. Die Standardkonverter sind die ObjectMapper und XmlMapper Instanzen, die über die instanziiert werden Jackson2ObjectMapperBuilder.

Anstatt die primäre manuell bereitzustellen ObjectMapper (anstelle des vom Bauherrn bereitgestellten), können Sie Spring anweisen wie zu bauen stattdessen der Objekt-Mapper. Auf diese Weise kann Spring seine High-Level-Konfigurationen durchführen, ohne dass Sie die untergeordneten Objekte manipulieren müssen, während die Funktionsweise weiterhin angepasst wird. Darüber hinaus können Sie auch die anpassen XmlMapper auf diese Weise auf einmal.

Um den Builder anzupassen, registrieren Sie einen neuen @Bean of Jackson2ObjectMapperBuilderCustomizer Typ, der den Builder anpasst und zurückgibt:

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

@JsonInclude-Anmerkung

Am anderen Ende des Spektrums können wir Anmerkungen als Low-Code-Alternative verwenden! Anmerkungen können auf Klassen- oder Methodenebene angewendet werden:

@JsonInclude(JsonInclude.Include.NON_NULL)

Dadurch können Sie statt des globalen Verhaltens des Objekt-Mappers nur bestimmte Klassen anpassen.

Sehen Sie sich unseren praxisnahen, praktischen Leitfaden zum Erlernen von Git an, mit Best Practices, branchenweit akzeptierten Standards und einem mitgelieferten Spickzettel. Hören Sie auf, Git-Befehle zu googeln und tatsächlich in Verbindung, um es!

Hinweis: Ab Jackson 2.0 ist der Wert der Anmerkung JsonInclude.Include.NON_NULL. Verwenden Sie für frühere Versionen include=JsonSerialize.Inclusion.NON_NULL.

@JsonInclude auf Klassenebene

Wenn Sie sich bewerben @JsonInclude Auf Klassenebene erstreckt sich die Anmerkung auf alle Getter und Setter:

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

Jedes gegebene Feld, das eine hat null Wert wird nicht serialisiert.

@JsonInclude auf Methodenebene

Alternativ können Sie die Annotation auf Methodenebene als granularste Option anwenden:

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

In diesem Snippet wird die Anmerkung nur auf die angewendet TransactionType Feld.

Zusammenfassung

In diesem Handbuch haben Sie gelernt, wie Sie Nullfelder in Jackson mit Java und Spring Boot ignorieren. Dies kann global erreicht werden, indem das zugrundeliegende Implizit ersetzt wird ObjectMapper -Instanz und Anpassen des Verhaltens der neuen primären Bean, die Sie registrieren.

Alternativ können Sie die anpassen Jackson2ObjectMapperBuilder das baut die ObjectMapper für Ihre Anwendung, anstatt die bereits gebaute zu ersetzen. Für eine Low-Code-Lösung – Sie können die ändern spring.jackson.default-property-inclusion Eigenschaft in Ihren Eigenschaftendateien.

Endlich – Sie können die verwenden @JsonInclude Annotation auf Klassen- oder Methodenebene.

Zeitstempel:

Mehr von Stapelmissbrauch