Αγνοήστε τα Null Fields με τον Jackson σε Java και Spring Boot

Οι μηδενικές τιμές προκύπτουν πολύ στην ανάπτυξη λογισμικού και στον σωστό χειρισμό null οι αξίες μπορούν να μετατραπούν σε επιστήμη από μόνες τους. Το Jackson είναι η de-facto βιβλιοθήκη για σειριοποίηση και αποσειροποίηση αντικειμένων Java – και ένα κοινό σενάριο αφορά τη σειριοποίηση αντικειμένων που έχουν null πεδία.

Σε αυτό το σύντομο σεμινάριο, θα ρίξουμε μια ματιά στο πώς μπορείτε να αγνοήσετε τα μηδενικά πεδία κατά τη σειριοποίηση ενός POJO με τον Τζάκσον.

Αλλαγή των ρυθμίσεων ObjectMapper

Το Jackson's ObjectMapper είναι το κεντρικό API που αντιστοιχίζει αντικείμενα σε σειριακές τιμές. Φυσικά, μπορείτε να προσαρμόσετε και να προσαρμόσετε τον τρόπο λειτουργίας του μέσω διαφόρων σημαιών, μία από τις οποίες είναι:

objectMapper.setSerializationInclusion(Include.NON_NULL);

Κατά τη σειριοποίηση με αυτόν τον χάρτη, οι ιδιότητες θα περιλαμβάνονται μόνο εάν δεν είναι μηδενικές.

Αυτό θέτει τη σημαία σε παγκόσμιο επίπεδο για οποιοδήποτε αντικείμενο σειριοποιείται με το objectMapper παράδειγμα. Εάν εργάζεστε με το Spring Boot και το ObjectMapper στο οποίο βασίζεται δεν είναι εκτεθειμένο, μπορείτε να αλλάξετε τη σημαία στο application.properties αρχείο:

spring.jackson.default-property-inclusion = non_null

Ή, αν χρησιμοποιείτε application.yml:

spring:
  jackson:
    default-property-inclusion: non_null

Σημείωση: Χρησιμοποιήθηκαν παλαιότερες εκδόσεις του Spring spring.jackson.serialization-inclusion=non_null αντί του spring.jackson.default-property-inclusion=non_null.

Εναλλακτικά, μπορείτε να ξεφλουδίσετε και να αντικαταστήσετε την προεπιλογή ObjectMapper για παράδειγμα με την εγγραφή ενός νέου @Primary @Bean, που ονομάστηκε objectMapper(), το οποίο παρακάμπτει την προεπιλεγμένη υλοποίηση και επιτρέπει την πλήρη προσαρμογή της παρουσίας που θα χρησιμοποιείται από προεπιλογή κατά τη σειριοποίηση και την αποσειριοποίηση:

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

Αυτός ο διαλογισμός στα @Bean πρέπει να μπει οποιοδήποτε αρχείο που σχολιάζεται με το @Configuration σχολιασμός, και συχνά βρίσκεται είτε σε μια εξειδικευμένη κλάση διαμόρφωσης είτε στην κύρια κατηγορία της εφαρμογής Spring Boot.

Αλλαγή της παρουσίας Jackson2ObjectMapperBuilder

Η άνοιξη χρησιμοποιεί το HttpMessageConverters για μετατροπή μεταξύ μηνυμάτων HTTP και αντικειμένων. Οι προεπιλεγμένοι μετατροπείς είναι οι ObjectMapper και XmlMapper περιπτώσεις που στιγμιοποιούνται μέσω του Jackson2ObjectMapperBuilder.

Αντί να παρέχετε χειροκίνητα το πρωτεύον ObjectMapper (αντικαθιστώντας αυτό που παρέχεται από τον κατασκευαστή), μπορείτε να δώσετε οδηγίες στο Spring πώς να οικοδομήσουμε αντί του αντικειμένου χαρτογράφησης. Αυτό επιτρέπει στο Spring να κάνει τις διαμορφώσεις υψηλού επιπέδου χωρίς να παραβιάζετε τα αντικείμενα χαμηλότερου επιπέδου, ενώ εξακολουθεί να προσαρμόζει τον τρόπο λειτουργίας του. Επιπλέον, μπορείτε επίσης να προσαρμόσετε το XmlMapper με αυτό τον τρόπο με μια κίνηση.

Για να προσαρμόσετε το πρόγραμμα δημιουργίας, καταχωρείτε ένα νέο @Bean of Jackson2ObjectMapperBuilderCustomizer τύπου, ο οποίος προσαρμόζει και επιστρέφει το πρόγραμμα δημιουργίας:

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

@JsonInclude Annotation

Στην άλλη άκρη του φάσματος, μπορούμε να χρησιμοποιήσουμε σχολιασμούς, ως εναλλακτική λύση χαμηλού κώδικα! Οι σχολιασμοί μπορούν να εφαρμοστούν σε επίπεδο τάξης ή σε επίπεδο μεθόδου:

@JsonInclude(JsonInclude.Include.NON_NULL)

Αυτό σας επιτρέπει να προσαρμόσετε μόνο ορισμένες κλάσεις, αντί για την καθολική συμπεριφορά του αντικειμένου αντιστοίχισης.

Ρίξτε μια ματιά στον πρακτικό μας οδηγό για την εκμάθηση του Git, με βέλτιστες πρακτικές, πρότυπα αποδεκτά από τον κλάδο και συμπεριλαμβανόμενο φύλλο εξαπάτησης. Σταματήστε τις εντολές του Git στο Google και πραγματικά μαθαίνουν το!

Σημείωση: Από το Jackson 2.0, η αξία του σχολιασμού είναι JsonInclude.Include.NON_NULL. Για παλαιότερες εκδόσεις, χρησιμοποιήστε include=JsonSerialize.Inclusion.NON_NULL.

@JsonInclude σε επίπεδο τάξης

Όταν υποβάλλετε αίτηση @JsonInclude σε επίπεδο τάξης, ο σχολιασμός επεκτείνεται σε όλους τους λήπτες και ρυθμιστές:

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

Κάθε δεδομένο πεδίο που έχει α null η τιμή δεν θα είναι σειριακή.

@JsonInclude σε επίπεδο μεθόδου

Εναλλακτικά, μπορείτε να εφαρμόσετε τον σχολιασμό σε επίπεδο μεθόδου ως την πιο λεπτομερή επιλογή:

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

Σε αυτό το απόσπασμα – ο σχολιασμός εφαρμόζεται μόνο στο TransactionType τομέα.

Συμπέρασμα

Σε αυτόν τον οδηγό, έχετε μάθει πώς να αγνοείτε τα μηδενικά πεδία στο Jackson, με Java και Spring Boot. Αυτό μπορεί να επιτευχθεί παγκοσμίως αντικαθιστώντας το υποκείμενο σιωπηρό ObjectMapper παράδειγμα και προσαρμογή της συμπεριφοράς του νέου κύριου φασολιού που καταχωρείτε.

Εναλλακτικά, μπορείτε να προσαρμόσετε το Jackson2ObjectMapperBuilder που χτίζει το ObjectMapper για την εφαρμογή σας αντί να αντικαταστήσετε την ήδη κατασκευασμένη. Για μια λύση χαμηλού κώδικα – μπορείτε να αλλάξετε το spring.jackson.default-property-inclusion ιδιοκτησία στα αρχεία ιδιοτήτων σας.

Τέλος – μπορείτε να χρησιμοποιήσετε το @JsonInclude σχολιασμός σε επίπεδο τάξης ή σε επίπεδο μεθόδου.

Σφραγίδα ώρας:

Περισσότερα από Stackabuse