使用 unitils ReflectionComparator 忽略字符串中的大小写
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
和 newObject
.
的特定类型实现您自己的 Java 比较器
查看 this。
对 ReflectionComparator
工作原理的调查为我提供了这个可行的解决方案。简而言之,我们必须添加另一个特殊的 Comparator
对象来处理比较器链中的 String
对象。
我们还必须做一些 bedlam,从 ReflectionComparatorFactory
中提取一个需要的 protected
静态方法,以减少代码重复。
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);
我正在使用 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
和 newObject
.
查看 this。
对 ReflectionComparator
工作原理的调查为我提供了这个可行的解决方案。简而言之,我们必须添加另一个特殊的 Comparator
对象来处理比较器链中的 String
对象。
我们还必须做一些 bedlam,从 ReflectionComparatorFactory
中提取一个需要的 protected
静态方法,以减少代码重复。
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);