我建议编写一个自定义CellProcessor来实现此目的。可以在每个CellProcessor链的开始处放置以下处理器-
它仅将委派给其后链接的处理器,并抑制任何单元处理异常。
package example;import java.util.ArrayList;import java.util.List;import org.supercsv.cellprocessor.CellProcessorAdaptor;import org.supercsv.cellprocessor.ift.CellProcessor;import org.supercsv.exception.SuperCsvCellProcessorException;import org.supercsv.util.CsvContext;public class SuppressException extends CellProcessorAdaptor { public static List<SuperCsvCellProcessorException> SUPPRESSED_EXCEPTIONS = new ArrayList<SuperCsvCellProcessorException>(); public SuppressException(CellProcessor next) { super(next); } public Object execute(Object value, CsvContext context) { try { // attempt to execute the next processor return next.execute(value, context); } catch (SuperCsvCellProcessorException e) { // save the exception SUPPRESSED_EXCEPTIONS.add(e); // and suppress it (null is written as "") return null; } }}它在起作用:
package example;import java.io.StringWriter;import java.util.Arrays;import java.util.List;import org.supercsv.cellprocessor.constraint.NotNull;import org.supercsv.cellprocessor.constraint.StrMinMax;import org.supercsv.cellprocessor.ift.CellProcessor;import org.supercsv.exception.SuperCsvCellProcessorException;import org.supercsv.io.CsvBeanWriter;import org.supercsv.io.ICsvBeanWriter;import org.supercsv.prefs.CsvPreference;public class TestSuppressExceptions { private static final CellProcessor[] PROCESSORS = { new SuppressException(new StrMinMax(0, 4)), new SuppressException(new NotNull()) }; private static final String[] HEADER = { "name", "age" }; public static void main(String[] args) throws Exception { final StringWriter stringWriter = new StringWriter(); ICsvBeanWriter beanWriter = null; try { beanWriter = new CsvBeanWriter(stringWriter, CsvPreference.STANDARD_PREFERENCE); beanWriter.writeHeader(HEADER); // set up the data Person valid = new Person("Rick", 43); Person nullAge = new Person("Lori", null); Person totallyInvalid = new Person("Shane", null); Person valid2 = new Person("Carl", 12); List<Person> people = Arrays.asList(valid, nullAge, totallyInvalid, valid2); for (Person person : people) { beanWriter.write(person, HEADER, PROCESSORS); if (!SuppressException.SUPPRESSED_EXCEPTIONS.isEmpty()) { System.out.println("Suppressed exceptions for row " + beanWriter.getRowNumber() + ":"); for (SuperCsvCellProcessorException e : SuppressException.SUPPRESSED_EXCEPTIONS) { System.out.println(e); } // clear ready for next row SuppressException.SUPPRESSED_EXCEPTIONS.clear(); } } } finally { beanWriter.close(); } // CSV will have empty columns for invalid data System.out.println(stringWriter); }}这是抑制的异常输出(第4行有两个异常,每列一个):
Suppressed exceptions for row 3:org.supercsv.exception.SuperCsvConstraintViolationException: null value encountered processor=org.supercsv.cellprocessor.constraint.NotNullcontext={lineNo=3, rowNo=3, columnNo=2, rowSource=[Lori, null]}Suppressed exceptions for row 4:org.supercsv.exception.SuperCsvConstraintViolationException: the length (5) of value 'Shane' does not lie between the min (0) and max (4) values (inclusive)processor=org.supercsv.cellprocessor.constraint.StrMinMaxcontext={lineNo=4, rowNo=4, columnNo=2, rowSource=[Shane, null]}org.supercsv.exception.SuperCsvConstraintViolationException: null value encountered processor=org.supercsv.cellprocessor.constraint.NotNullcontext={lineNo=4, rowNo=4, columnNo=2, rowSource=[Shane, null]}和CSV输出
name,ageRick,43Lori,,Carl,12
请注意无效值是如何写入的,
""因为
SuppressException处理器会
null为这些值返回(不是因为您无效,所以您还是要使用CSV输出!)。



