如何使用lombok @ToString跳过空字段

时间:2019-02-09 08:52:59

标签: lombok

我没有成功地将lombok @toString与跳过null字段一起使用的简单方法。

我想使用方面编程为所有函数创建自己的toString函数。这样,我可以检查所有空字段并跳过该字段。

但这是个好习惯,还是lombok @toString可以简单地做到这一点?

最好的问候

3 个答案:

答案 0 :(得分:2)

您可以像下面那样覆盖toString方法

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

答案 1 :(得分:0)

这是Lombok上的一个未解决问题,因此尚未实现。参见#1297

答案 2 :(得分:0)

我找不到执行Lombok的方法,因此我使用以下方法对生成的String进行后处理:

/**
 * 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;
}

请注意,不支持诸如"when, x=null, it fails"之类的棘手对象属性(但这不是我的用例问题)。我本可以使用https://commons.apache.org/proper/commons-lang/javadocs/api-3.9/org/apache/commons/lang3/builder/ReflectionToStringBuilder.html来生成“ toString”内容,但是我想重用Lombok @ToString(excludes="myExcludedField")后面的字段排除逻辑。