超级 CSV:寻找等于 LMinMax 的整数
Super CSV: Looking for integer equivalent to LMinMax
使用 supercsv,我可以使用 LMinMax() 将最小和最大约束应用于长列,但是如何对映射到整数的列执行此操作?如果我在映射到我的 bean 中的整数的列上使用 LMinMax,当我尝试读取文件时,我得到一个 org.supercsv.exception.SuperCsvReflectionException,因为它正在寻找一个 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()
的调用重用了 min/max 验证,但也意味着您无法阻止它通过Long
到下一个处理器,所以我只是禁用了链接)。
使用 supercsv,我可以使用 LMinMax() 将最小和最大约束应用于长列,但是如何对映射到整数的列执行此操作?如果我在映射到我的 bean 中的整数的列上使用 LMinMax,当我尝试读取文件时,我得到一个 org.supercsv.exception.SuperCsvReflectionException,因为它正在寻找一个 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()
的调用重用了 min/max 验证,但也意味着您无法阻止它通过Long
到下一个处理器,所以我只是禁用了链接)。