使用supercsv,我可以使用LMinMax()将最小和最大约束应用于长列,但是如何使用映射到整数的列来执行此操作?如果我在一个映射到我的bean中的整数的列上使用LMinMax,当我尝试读取该文件时,我得到一个org.supercsv.exception.SuperCsvReflectionException,因为它正在寻找一个取长整数而不是整数的setter。
答案 0 :(得分:0)
唯一可行的单元处理器组合就像
new LMinMax(0, 10, new FmtNumber("###", new ParseInt()))
这太可怕了。
问题是Super CSV的ReflectionUtils
仅允许在类型上进行精确匹配(尽管支持自动装箱)。你可以在Github上提出一个功能请求来修复它。
您可以使用CsvDozerBeanReader
解决此问题(Dozer支持从Long
到Integer
非常愉快地映射),或者您可以定义自己的自定义单元格处理器,如下所示。
public class IntMinMax extends LMinMax {
public IntMinMax(int min, int max) {
super(min, max);
}
@Override
public Object execute(Object value, CsvContext context) {
Long result = (Long) super.execute(value, context);
return result.intValue();
}
}
这应该可行,但请注意,它不允许处理器被链接(调用super.execute()
重用最小/最大验证,但也意味着你不能阻止它通过{{1到下一个处理器,所以我只是禁用了链接。)