使用OpenCSV读取CSV到POJO时,无法识别已存在列问题求助
解决方案
1. 修复列名大小写匹配问题
你的错误根源是OpenCSV验证必填字段时,将POJO注解中的"Last Name"转换为大写的LAST NAME,而CSV列名是Last Name,默认匹配策略大小写敏感。即便用了FuzzyMappingStrategyBuilder,未配置合适规则仍会精确匹配。
有两种解决方式:
方式一:给@CsvBindByName添加ignoreCase=true属性
直接在POJO注解中开启忽略大小写匹配:
@NoArgsConstructor @Getter public class SimpleUser { @CsvBindByName(column = "First Name", required = true, ignoreCase = true) private String firstName; @CsvBindByName(column = "Last Name", required = true, ignoreCase = true) private String lastName; @CsvBindByName(column = "Email", required = true, ignoreCase = true) private String email; @CsvBindByName(column = "User Name", required = true, ignoreCase = true) private String userName; @CsvBindAndSplitByName(column = "Roles", elementType = String.class, collectionType = LinkedList.class) private List<String> roles; }
此时可简化处理代码,无需FuzzyMappingStrategy:
private List<SimpleUser> getCsvUsersFromCsv(String fileLocation) { try (Reader reader = new FileReader(fileLocation)) { return new CsvToBeanBuilder(reader) .withType(SimpleUser.class) .build() .parse(); } }
方式二:配置FuzzyMappingStrategy的模糊匹配规则
若坚持使用FuzzyMappingStrategy,需明确设置忽略大小写的匹配器:
private List<SimpleUser> getCsvUsersFromCsv(String fileLocation) { MappingStrategy<SimpleUser> strategy = new FuzzyMappingStrategyBuilder<SimpleUser>() .withMatcher(new IgnoreCaseAndTrimMatcher()) // 忽略大小写+去除首尾空格 .build(); strategy.setType(SimpleUser.class); try (Reader reader = new FileReader(fileLocation)) { return new CsvToBeanBuilder(reader) .withMappingStrategy(strategy) .build() .parse(); } }
IgnoreCaseAndTrimMatcher是OpenCSV内置匹配器,能处理大小写不一致、首尾空格差异的场景。
2. 修复@CsvBindAndSplitByName类型不匹配问题
你的roles字段是List<String>,但注解中elementType = Double.class,会导致解析时尝试将CSV字符串转为Double,抛出类型转换异常。需将elementType改为String.class:
@CsvBindAndSplitByName(column = "Roles", elementType = String.class, collectionType = LinkedList.class) private List<String> roles;
验证测试
修改后重新运行代码,CSV的Last Name列会与POJO的lastName字段正确绑定,roles字段也能正常解析字符串列表。
内容的提问来源于stack exchange,提问作者RunnersReign
相关产品推荐
相关产品推荐

