2015-06-16 10 views
5

Używam wiosennej partii do przetwarzania plików do bazy danych i obecnie używam PropertyEditors do konwersji ciągów w pliku z ograniczeniami do jakiegoś obiektu, jak podano poniżej.BeanWrapperFieldsetMapper Mapping PropertyEditor na podstawie pola

Map<Class<?>, PropertyEditor> editors = new HashMap<>(); 
CustomDateEditor dateEditor = new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true); 
editors.put(Date.class, dateEditor); 

Więc jeśli mam pole daty używam CustomDateEditor i jej powodzeniem parsowania dany dzień format string. Jeśli jednak mam kilka ciągów dat w tym samym pliku z innym formatowaniem, nie mogę ich przeanalizować. Potrzebuję powiązać redaktorów z polami, więc czy jest jakiś sposób, żeby to zrobić?

+0

AFAIK wiosna partia wewnętrznie rejestruje Redakcja niestandardowe z mapą , PropertyEditors> podczas tworzenia DataBinder który wiąże klasę przewidzianego w mapie do pól obiektu docelowego. Więc nie widzę opcji, by robić to, co mówisz. – dShringi

+0

Jak podano powyżej w pytaniu, używam już SimpleDateFormat w CustomDateEditor, więc nie ma potrzeby używania nowego Formattera, nie dotyczy to formatu daty, jego obsługi w wielu formatach. – dShringi

+0

Czy byłeś w stanie znaleźć rozwiązanie tego problemu? – James

Odpowiedz

0

Jeśli dobrze rozumiem pytanie, chcesz, aby dwie odrębne kolumny miały różne formaty daty (nie różne wiersze mają różne formaty). Możesz to zrobić, implementując FieldSetMapper, jak podano w docs.

@Bean 
public FlatFileItemReader<Person> secondReader() { 
    FlatFileItemReader<Person> reader = new FlatFileItemReader<Person>(); 
    reader.setResource(new ClassPathResource("sample-data2.csv")); 
    reader.setLineMapper(new DefaultLineMapper<Person>() { 
     { 
      setLineTokenizer(new DelimitedLineTokenizer() { 
       { 
        setNames(new String[] { "firstName", "lastName", "fDate", "sDate" }); 
       } 
      }); 
      setFieldSetMapper(new PersonMapper()); 
     } 
    }); 
    return reader; 
} 

realizacja:

public class PersonMapper implements FieldSetMapper<Person> { 

@Override 
public Person mapFieldSet(FieldSet fieldSet) throws BindException { 
    Person person = new Person(); 
    person.setFirstName(fieldSet.readString("firstName")); 
    person.setLastName(fieldSet.readString("lastName")); 
    person.setFirstDate(fieldSet.readDate("fDate", "MM/dd/yyyy")); 
    person.setSecondDate(fieldSet.readDate("sDate", "dd-MMM-yyyy")); 
    return person; 
} 

}

Powiązane problemy