我没有成功地将lombok @toString与跳过null字段一起使用的简单方法。
我想使用方面编程为所有函数创建自己的toString函数。这样,我可以检查所有空字段并跳过该字段。
但这是个好习惯,还是lombok @toString可以简单地做到这一点?
最好的问候
答案 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")
后面的字段排除逻辑。