4
votes

Comment ignorer un champ nul avec lombok @ToString

J'ai trouvé sans succès le moyen simple d'utiliser lombok @toString avec le comportement de champ skip null.

Je pense créer ma propre fonction toString pour toutes les fonctions en utilisant la programmation d'aspect. Comme ça, je peux vérifier tous les champs nuls et ignorer cela.

Mais c'est la bonne pratique, ou lombok @toString a une option pour le faire simplement?

Meilleures salutations


0 commentaires

3 Réponses :


3
votes

C'est un problème ouvert sur Lombok, donc il ne fait pas encore partie de l'implémentation. voir # 1297 .


0 commentaires

1
votes

Je n'ai pas trouvé de moyen Lombok de le faire, donc je post-traite la chaîne générée en utilisant la méthode suivante:

/**
 * Removes the null values from String generated through the @ToString annotation.
 * For example:
 * - replaces:  AddressEntity(id=null, adrType=null, adrStreet=null, adrStreetNum=null, adrComplement=null, adrPoBox=null, adrNip=null, adrCity=city, adrCountry=null, adrNameCorresp=nameCorresp, adrSexCorresp=null, adrSource=null, adrSelectionReason=null, validityBegin=null, validityEnd=null, lastModification=null, dataQuality=null)
 * - by:        AddressEntity(adrCity=city, adrNameCorresp=nameCorresp)
 * Note: does not support tricky attribute content such as "when, x=null, it fails".
 * @param lombokToString a String generated by Lombok's @ToString method
 * @return a string without null values
 */
public static String removeToStringNullValues(String lombokToString) {
    //Pattern
    return lombokToString != null ? lombokToString
            .replaceAll("(?<=(, |\\())[^\\s(]+?=null(?:, )?", "")
            .replaceFirst(", \\)$", ")") : null;
}

Notez que les attributs d'objets délicats tels que "quand, x = null, ça échoue " ne sont pas pris en charge (mais ce n'est pas un problème pour mon cas d'utilisation). J'aurais pu utiliser https://commons.apache.org/proper/commons-lang/javadocs/api-3.9/org/apache/commons/lang3/builder/ReflectionToStringBuilder.html pour générer le contenu" toString ", mais Je voulais réutiliser la logique d'exclusion de champ derrière Lombok @ToString(excludes="myExcludedField").


0 commentaires

2
votes

Vous pouvez remplacer la méthode toString comme ci-dessous

public class MyClass{

field a;
field b;

@Override
public String toString() {
    Field[] fields = MyClass.class.getDeclaredFields();
    String res = "";
    for(int x = 0; x < fields.length; x++){
        try {
            res += ( fields[x].get(this)) != null ? fields[x].getName() + "="+ (fields[x].get(this).toString()) + "," : "";
        } catch (Exception ex) {
            
        } 
    }
    return res;
}


0 commentaires