我有以下方法
public static boolean isCSVStructureValid(InputStream csv, InputStream csvSchema){
boolean failFast = true;
boolean trace = false;
Reader csvReader = new InputStreamReader(csv);
Reader csvSchemaReader = new InputStreamReader(csvSchema);
List<Substitution> pathSubtitution = new ArrayList<>();
List<FailMessage> messages = CsvValidator.validate(csvReader, csvSchemaReader, failFast,
pathSubtitution,true, trace);
if (messages.isEmpty()){
return true;
}
else{
LOGGER.log(Level.SEVERE, "The CSV stream structure is invalid: {0}", messages);
return false;
}
}
如何记录List消息中存储的消息内容? 这是FailMessage类型的JavaDoc:http://javadox.com/uk.gov.nationalarchives/csv-validator-java-api/1.0-RC2/uk/gov/nationalarchives/csv/validator/api/java/FailMessage.html
目前我得到了这个输出:
SEVERE: The CSV stream structure is invalid: [uk.gov.nationalarchives.csv.validator.api.java.ErrorMessage@1a4927d6]
虽然我希望看到更有用的内容,例如:
SEVERE: The CSV stream structure is invalid: [3.6] failure: Invalid column definition
User ID: positiveInteger
^
我可以通过这样做获得:
LOGGER.log(Level.SEVERE, "The CSV stream structure is invalid: {0}", messages.get(0).getMessage());
答案 0 :(得分:0)
在您的情况下,ErrorMessage不会覆盖toString方法,以根据您的预期提供正确的消息。当您知道它存储为列表时,如果您可以获取列表并通过它们进行迭代
答案 1 :(得分:0)
优雅的解决方案是:
messages.forEach(m -> LOGGER.log(Level.SEVERE,m.getMessage()));
答案 2 :(得分:0)
正如您所看到的,该类不会覆盖默认的Object.toString()
。如果您关注链接,您将在javadoc中看到。
您有几种方法可以解决此问题:
最简单的方法是覆盖该方法: 如果可以,您可以修改此类。但我猜你用它作为API。 在这种情况下,请考虑向其存储库发出拉取请求: https://github.com/digital-preservation/csv-validator/pulls
您可以通过迭代对象来创建一个返回String
的辅助方法,调用getMessage()
并将结果附加到StringBuilder
您可以为记录器创建自定义格式化程序,请参阅java.util.logging.Formatter.format(java.util.logging.LogRecord)
我假设您使用此日志记录框架。
高级解决方案是使用字节码修改。 Inject New Methods and Properties into Classes During Runtime
希望您能从上面的列表中找到一个好的解决方案。