Spring Batch FlatFileItemReader读取CSV空值转0配置求助
解决Spring Batch FlatFileItemReader读取CSV空值映射为Int类型的问题
这个问题核心是FieldSet.readInt(String name)方法遇到空字符串时,会直接尝试强制转换为整数,从而抛出NumberFormatException。要实现空列映射为0的需求,有几种简单直接的解决方案:
方案一:使用readInt重载方法指定默认值
这是最便捷的处理方式,FieldSet提供了带默认值的readInt重载方法:readInt(String name, int defaultValue),当目标字段为空或不存在时,会自动返回你指定的默认值(这里设为0)。
修改你的InfoFileMapper类代码如下:
public class InfoFileMapper implements FieldSetMapper<InfoDTO> { @Override public InfoDTO mapFieldSet(FieldSet fieldSet) throws BindException { if(fieldSet == null){ return null; } return new InfoDTO( fieldSet.readString("CUSTR_NBR"), fieldSet.readString("SUR_NAME"), fieldSet.readString("CHECK_FLAG"), // 为空时返回默认值0 fieldSet.readInt("RESN_CODE", 0), // 为空时返回默认值0 fieldSet.readInt("EMPNO", 0) ); } }
方案二:手动判断空值并转换(适配复杂场景)
如果需要对空值做更精细的判断逻辑(比如区分空字符串和空白字符),可以先读取字符串再手动转换:
import org.springframework.util.StringUtils; public class InfoFileMapper implements FieldSetMapper<InfoDTO> { @Override public InfoDTO mapFieldSet(FieldSet fieldSet) throws BindException { if(fieldSet == null){ return null; } // 处理RESN_CODE字段 String resnCodeStr = fieldSet.readString("RESN_CODE"); int resnCode = StringUtils.hasText(resnCodeStr) ? Integer.parseInt(resnCodeStr) : 0; // 处理EMPNO字段 String empnoStr = fieldSet.readString("EMPNO"); int empno = StringUtils.hasText(empnoStr) ? Integer.parseInt(empnoStr) : 0; return new InfoDTO( fieldSet.readString("CUSTR_NBR"), fieldSet.readString("SUR_NAME"), fieldSet.readString("CHECK_FLAG"), resnCode, empno ); } }
补充说明
- 你的
DelimitedLineTokenizer配置是正常的,它会正确将CSV中的空列解析为空字符串,不需要额外调整。 - 如果你有大量Int类型字段需要统一处理默认值,可以封装一个通用的字段转换工具类,避免重复代码。
内容的提问来源于stack exchange,提问作者Book
相关产品推荐
相关产品推荐

