Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用unitils ReflectionComparator忽略字符串中的大小写_Java_Unitils_Ignore Case - Fatal编程技术网

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我的意思是“通用”,即避免对所有对象进行手动编码规范化