Исключение, которое вы получаете, заключается в том, что CsvBeanReader не может создать экземпляр вашего класса TypeWithEnum
, поскольку у него нет конструктора по умолчанию (без аргументов).Вероятно, это хорошая идея - напечатать трассировку стека, чтобы вы могли увидеть полную информацию о том, что пошло не так.
Super CSV основан на том факте, что вы должны были предоставить действительный Java bean т.е. класс с конструктором по умолчанию и общедоступными методами получения / установки для каждого из его полей.
Таким образом, вы можете исправить исключение, добавив следующее к TypeWithEnum
:
public TypeWithEnum(){
}
Что касаетсяПодсказки при разборе перечислений имеют два самых простых варианта:
1.Использование процессора HashMapper
@Test
public void hashMapperTest() throws Exception {
// two lines of input
String input = "CANCEL\nREFUND";
// you could also put the header in the CSV file
// and use inFile.getCSVHeader(true)
final String[] header = new String[] { "type" };
// map from enum name to enum
final Map<Object, Object> typeMap = new HashMap<Object, Object>();
for( Type t : Type.values() ) {
typeMap.put(t.name(), t);
}
// HashMapper will convert from the enum name to the enum
final CellProcessor[] processors =
new CellProcessor[] { new HashMapper(typeMap) };
ICsvBeanReader inFile =
new CsvBeanReader(new StringReader(input),
CsvPreference.STANDARD_PREFERENCE);
TypeWithEnum myEnum;
while((myEnum = inFile.read(TypeWithEnum.class, header, processors)) !=null){
System.out.println(myEnum.getType());
}
}
2.Создание собственного CellProcessor
Создайте свой процессор
package org.supercsv;
import org.supercsv.cellprocessor.CellProcessorAdaptor;
import org.supercsv.cellprocessor.ift.CellProcessor;
import org.supercsv.exception.SuperCSVException;
import org.supercsv.util.CSVContext;
public class TypeProcessor extends CellProcessorAdaptor {
public TypeProcessor() {
super();
}
public TypeProcessor(CellProcessor next) {
super(next);
}
public Object execute(Object value, CSVContext context) {
if (!(value instanceof String)){
throw new SuperCSVException("input should be a String!");
}
// parse the String to a Type
Type type = Type.valueOf((String) value);
// execute the next processor in the chain
return next.execute(type, context);
}
}
Используйте его!
@Test
public void customProcessorTest() throws Exception {
// two lines of input
String input = "CANCEL\nREFUND";
final String[] header = new String[] { "type" };
// HashMapper will convert from the enum name to the enum
final CellProcessor[] processors =
new CellProcessor[] { new TypeProcessor() };
ICsvBeanReader inFile =
new CsvBeanReader(new StringReader(input),
CsvPreference.STANDARD_PREFERENCE);
TypeWithEnum myEnum;
while((myEnum = inFile.read(TypeWithEnum.class, header, processors)) !=null){
System.out.println(myEnum.getType());
}
}
Я работаю над предстоящим выпуском Super CSV.Я обязательно обновлю веб-сайт, чтобы было ясно, что у вас должен быть действительный компонент Java - и, возможно, описание доступных процессоров, для тех, кто не склонен читать Javadoc.