2

我正在使用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
}

任何想法,如何实现?

4

2 回答 2

0

ReflectionComparatorMode没有模仿ignore_case行为的模式。您没有指定 and 的类型,oldObjectnewObject我想您可以在将它们传递给之前“规范化”它们ReflectionComparator(将所有String字段转换为大写或小写),或者根据oldObjectand的特定类型实现您自己的 Java Comparator newObject

看看这个

于 2015-04-21T10:43:52.567 回答
0

对工作原理的调查ReflectionComparator给了我这个可行的解决方案。简而言之,我们必须添加另一个特殊Comparator对象来处理String比较器链中的对象。

此外,为了减少代码加倍,我们还必须从提取一种需要的静态方法来做一些混乱。protectedReflectionComparatorFactory

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);
于 2015-04-21T11:36:53.283 回答