【问题标题】:Ignoring case in strings with unitils ReflectionComparator使用 unitils ReflectionComparator 忽略字符串中的大小写
【发布时间】:2015-06-28 11:00:05
【问题描述】:

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

任何想法,如何实现?

【问题讨论】:

    标签: java unitils ignore-case


    【解决方案1】:

    ReflectionComparatorMode 没有模仿ignore_case 行为的模式。 您没有指定 oldObjectnewObject 的类型,但我想您可以在将它们传递给 ReflectionComparator 之前“规范化”它们(将所有 String 字段转换为上或下case) 或根据oldObjectnewObject 的具体类型实现自己的Java Comparator。

    查看this

    【讨论】:

    • 谢谢,但我不能。我正在处理大量不同的类,如果我可以将它们全部标准化,那么在没有任何 unitils 工具的情况下手动比较会简单得多。
    • 感受你的痛苦。也许您可以使用 ReflectionUtils unitils.org/apidocs/org/unitils/util/ReflectionUtils.html 在将两个对象传递给 ReflectionComparator 之前对其进行按摩?
    • 再次感谢您的想法,但我找到了真正可行的通用解决方案。如果你感兴趣,请看我的回答
    • @avaid 我的意思是“通用”,避免手动编码所有对象的规范化
    【解决方案2】:

    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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-11
      • 1970-01-01
      • 2016-01-29
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 2011-02-06
      • 2019-12-03
      相关资源
      最近更新 更多