2017-01-04 184 views
-2

的名單,我得到了下面的方法Java的記錄器,記錄消息

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; 
    } 
} 

我如何才能登錄存儲列表信息中的消息的內容? 這是類型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: [[email protected]27d6] 

而我希望看到更多的東西有用,例如:

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

如果你有一個'List'並且想要對每個元素執行一些操作(例如,調用'getMessage()'),那麼你將遍歷元素。你聽說過['for'loops](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/for.html),對嗎?是的,當然你有。所以我想我不明白你在問什麼。 – Andreas

+0

我知道,但是如何在日誌記錄中以優雅的方式來做到這一點? – user3727540

+0

'LOGGER.log(Level.SEVERE,「CSV流結構無效:」); for(FailMessage message:messages)LOGGER.log(Level.SEVERE,「」+ message.getMessage());'?又名**循環**。 – Andreas

回答

0

正如你可以看到類不覆蓋默認Object.toString()。如果你按照你的鏈接,你會看到在javadoc。

您有幾種選擇來解決這個問題:

  1. 最簡單的是重寫方法: 你,如果你可以修改這個類。但我想你可以將它用作API。 在這種情況下,考慮到發出拉入請求他們的倉庫: https://github.com/digital-preservation/csv-validator/pulls

  2. 您可以創建通過對象迭代返回String一個輔助方法,調用getMessage()並將結果追加到StringBuilder

  3. 您可以爲記錄器創建自定義格式化程序,請參閱java.util.logging.Formatter.format(java.util.logging.LogRecord) 我假定您使用此記錄框架。

  4. 先進的解決方案是使用字節碼修改。 Inject New Methods and Properties into Classes During Runtime

希望你能找到從上面的列表中自己的一個好辦法。

0

在你的情況下,ErrorMessage不會覆蓋toString方法來按照您的預期提供正確的消息。當你知道它被存儲爲列表,如果你能得到的名單和迭代雖然他們

0

優雅的解決方案是:

  messages.forEach(m -> LOGGER.log(Level.SEVERE,m.getMessage()));