使用 supercsv,我可以使用 LMinMax() 对长列应用最小和最大约束,但是如何使用映射到整数的列来做到这一点?如果我在映射到 bean 中的整数的列上使用 LMinMax,当我尝试读取中的文件时,我会得到 org.supercsv.exception.SuperCsvReflectionException,因为它正在寻找需要 long 而不是整数的 setter。
最佳答案
唯一可行的细胞处理器组合是这样的
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()
的调用重用最小/最大验证,但也意味着您不能阻止它将 Long
传递到下一个处理器,所以我只是禁用了链接)。
关于java - super CSV : Looking for integer equivalent to LMinMax,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30511338/