Οι μηδενικές τιμές προκύπτουν πολύ στην ανάπτυξη λογισμικού και στον σωστό χειρισμό 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
σχολιασμός σε επίπεδο τάξης ή σε επίπεδο μεθόδου.