[英]Ignoring case in strings with unitils ReflectionComparator
我使用unitils工具通过ReflectionComparator
进行深层对象比较:
ReflectionComparatorMode[] modes = {ReflectionComparatorMode.LENIENT_ORDER, ReflectionComparatorMode.IGNORE_DEFAULTS};
ReflectionComparator comparator = ReflectionComparatorFactory.createRefectionComparator(modes);
Difference difference = comparator.getDifference(oldObject, newObject);
事实证明,此ReflectionComparator
不会忽略String
字段值中的大小写。 在ReflectionComparatorMode
枚举中,没有用于此目的的串行模式:
public enum ReflectionComparatorMode {
IGNORE_DEFAULTS,
LENIENT_DATES,
LENIENT_ORDER
}
有什么想法,如何实现?
ReflectionComparatorMode
没有模拟模仿ignore_case
行为的模式。 您没有指定oldObject
和newObject
的类型,但我想您可以在将它们传递给ReflectionComparator
之前(将所有String
字段都转换为大写或小写)进行“ 规范化 ”,或者根据oldObject
的特定类型实现自己的Java Comparator和newObject
。
看看这个 。
对ReflectionComparator
工作方式进行调查后,得出了这个可行的解决方案。 简而言之,我们必须添加另一个特殊的Comparator
对象来处理比较器链中的String
对象。
此外,我们必须做一些喧闹与提取一个需要protected
从静态方法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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.