当我遍历Java bean时,我将Univocity CSV解析器与例程一起使用。有没有一种方法可以验证CSV标头?当我编辑CSV并添加无效的标头时,它只是插入给定的bean null中而没有任何错误。
模型类:
public class Customer {
@Format(formats ="yyyy-MM-dd")
@Parsed(field="C_DAY")
private Date day;
@Parsed(field="C_ID")
private Long id;
@Parsed(field="C_TYPE")
private String type;
@Format(formats ="yyyy-MM-dd")
@Parsed(field="C_ORIGIN_DATE")
private Date originDate;
@Format(formats ="yyyy-MM-dd")
@Parsed(field="C_REL_DATE")
private Date relDate;
@Parsed(field="C_LEGAL_ID")
private String legalId;
@Parsed(field="C_NAME")
private String name;}
解析器:
@Autowired
private CustomerDAO dao;
public void parse(File file) throws IOException, SQLException, CustomerValidationException, ParseException {
CsvParserSettings parserSettings = new CsvParserSettings();
parserSettings.getFormat().setLineSeparator("\n");
parserSettings.setHeaderExtractionEnabled(false);
CsvRoutines routines = new CsvRoutines(parserSettings);
List<Customer> customers = new ArrayList<>();
java.util.Date stamp = getTimestamp(file);
dao.checkTimestampDate(stamp);
for (Customer customer : routines.iterate(Customer.class, file, "UTF-8")) {
validateFileDateWithFileName(stamp, customer.getDay());
validateCustomer(customer);
customers.add(customer);
}
dao.save(customers);
}
答案 0 :(得分:2)
此处是库的作者。 g++ main.cpp -o myprog
具有BeanListProcessor
属性,可以将其设置为strictHeaderValidationEnabled
,以确保输入中存在类中的所有标头。
在那种情况下,您只是不能使用true
,因为该类实现了使用其内部行处理器的便捷方法,因此您的将被忽略。尝试以下代码:
CsvRoutines
希望这会有所帮助。
答案 1 :(得分:0)
基于Jeronimo Backes的回答。
如果您在Bean上有@Header
注释或知道确切的标头,但仍然需要setHeaderExtractionEnabled(true)
:
public <T> List<T> parse(File file, Class<T> beanType, char delimiter, Charset charset) {
String[] headers = beanType.getDeclaredAnnotation(Headers.class).sequence(); // or other source
CsvParserSettings parserSettings = Csv.parseRfc4180(); // or some other
parserSettings.detectFormatAutomatically(delimiter);
parserSettings.setHeaderExtractionEnabled(true);
// initialize new processor (stateful, should not be reused! See implementation of parseAll)
BeanListProcessor<T> processor= new BeanListProcessor<>();
processor.setStrictHeaderValidationEnabled(true);
parserSettings.setProcessor(processor);
CsvParser csvParser = new CsvParser(parserSettings);
csvParser.parse(file, charset);
// header validation
String[] headersParsed = processor.getHeaders();
if (!Arrays.equals(headers, headersParsed)) {
String message = String.format("Header validation failed. Expected: %s, but was: %s",
Arrays.toString(headers), Arrays.toString(headersParsed));
throw new DataProcessingException(message);
}
return beanListProcessor.getBeans();
}