Java 使用unitils ReflectionComparator忽略字符串中的大小写
我正在使用此工具,通过Java 使用unitils ReflectionComparator忽略字符串中的大小写,java,unitils,ignore-case,Java,Unitils,Ignore Case,我正在使用此工具,通过ReflectionComparator,进行深度对象比较: ReflectionComparatorMode[] modes = {ReflectionComparatorMode.LENIENT_ORDER, ReflectionComparatorMode.IGNORE_DEFAULTS}; ReflectionComparator comparator = ReflectionComparatorFactory.createRefectionComparator(m
ReflectionComparator
,进行深度对象比较:
ReflectionComparatorMode[] modes = {ReflectionComparatorMode.LENIENT_ORDER, ReflectionComparatorMode.IGNORE_DEFAULTS};
ReflectionComparator comparator = ReflectionComparatorFactory.createRefectionComparator(modes);
Difference difference = comparator.getDifference(oldObject, newObject);
事实证明,这个ReflectionComparator
不会忽略String
字段值中的大小写。在ReflectionComparatorMode
enum:
public enum ReflectionComparatorMode {
IGNORE_DEFAULTS,
LENIENT_DATES,
LENIENT_ORDER
}
任何想法,如何实现?
反思比较模式
没有模仿案例行为的模式。
您没有指定oldObject
和newObject
的类型,但我想您可以在将它们传递给ReflectionComparator
之前对它们进行“规范化”(将所有String
字段转换为大写或小写)或者根据oldObject
和newObject
的特定类型实现自己的Java比较器
退房 对
ReflectionCompactor
工作原理的调查给了我这个可行的解决方案。简言之,我们必须添加另一个特殊的比较器
对象,用于处理比较器链中的字符串
对象
此外,为了减少代码翻倍,我们还必须从ReflectionComparatorFactory
中提取一个所需的受保护的
静态方法
ReflectionComparatorMode[] modes = {ReflectionComparatorMode.LENIENT_ORDER, ReflectionComparatorMode.IGNORE_DEFAULTS};
List<org.unitils.reflectionassert.comparator.Comparator> comparators = new ArrayList<>();
comparators.add(new Comparator() {
@Override
public boolean canCompare(Object left, Object right) {
return left instanceof String && right instanceof String;
}
@Override
public Difference compare(Object left, Object right, boolean onlyFirstDifference, ReflectionComparator reflectionComparator) {
return ((String) left).equalsIgnoreCase((String) right) ? null : new Difference("Non equal values: ", left, right);
}
});
comparators.addAll(
new ReflectionComparatorFactory() {
public List<Comparator> getComparatorChainNonStatic(Set<ReflectionComparatorMode> modes) {
return getComparatorChain(modes);
}
}.getComparatorChainNonStatic(asSet(modes)));
ReflectionComparator comparator = new ReflectionComparator(comparators);
ReflectionComparatorMode[]模式={ReflectionComparatorMode.lencient\u顺序,ReflectionComparatorMode.IGNORE\u默认值};
列表比较器=新的ArrayList();
添加(新的比较器(){
@凌驾
公共布尔canCompare(对象左、对象右){
返回字符串的左实例和字符串的右实例;
}
@凌驾
公共差异比较(对象左、对象右、仅布尔值第一差异、反射率比较器反射率比较器){
return((字符串)left).equalsIgnoreCase((字符串)right)?null:新的差异(“非相等值:”,left,right);
}
});
比较器.addAll(
新的ReflectionComparatorFactory(){
公共列表getComparatorChainNonStatic(设置模式){
返回getComparatorChain(模式);
}
}.getComparatorChainNonStatic(资产(模式));
ReflectionComparator comparator=新的ReflectionComparator(比较器);
谢谢,但我不能。我正在处理大量不同的类,如果我能将它们全部规范化,那么在没有任何unitils
工具的情况下手动进行比较会简单得多。感受你的痛苦吧。也许您可以在将两个对象传递给ReflectionComparator之前使用ReflectionUtils按摩这两个对象?再次感谢您的想法,但我发现了真正可行的通用解决方案。如果你感兴趣,看看我的answer@avaid我的意思是“通用”,即避免对所有对象进行手动编码规范化