2017-11-22 138 views
0

POJOベースのスキーマを作成するためにFasterXML Jackson CSVマッパーを構成しているにもかかわらず、適切な構成が提供されていないと主張します。私は、次の例外を取得:Jackson CsvMapperがスキーマ構成にかかわらずPOJOに正しくデシリアライズできない

com.fasterxml.jackson.databind.JsonMappingException: No value type configured for ObjectReader 
com.fasterxml.jackson.databind.ObjectReader._findRootDeserializer(ObjectReader.java:1371) 
com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:1265) 
com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:897) 
aol.model.core.services.admin.CSVParserService.parseCSVFileStreamAsClass(CSVParserService.java:42) 
aol.rest.controller.AdminController.importCsvData(AdminController.java:30) 
aol.rest.controller.AdminController$$FastClassBySpringCGLIB$$b9304c43.invoke(<generated>) 
org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
... 

私のPOJOは

@JsonPropertyOrder({"firstName", "lastName", "age"}) 
public class Person { 
    String firstName; 
    String lastName; 
    Integer age; 
    public Person() {} //no other use than to avoid no-suitable-construction found issue 
    //getters and setters omitted for brevity 
} 

マイ解析コードが

public MappingIterator<Person> parseCSVFileStreamAsClass(MultipartFile file) throws IOException { 
     StringBuilder lines = new StringBuilder(); 
     String lineSeparator = System.getProperty("line.separator"); 
     try(BufferedReader reader = new BufferedReader(new InputStreamReader(file.getInputStream()))) { 
      for (String r = reader.readLine(); r != null; r = reader.readLine()) { 
       lines.append(r).append(lineSeparator); 
      } 
     } 

     CsvMapper mapper = new CsvMapper(); 
     CsvSchema schema = mapper 
       .schemaFor(Person.class) 
       .withHeader() 
       .withLineSeparator(lineSeparator); 
     MappingIterator<Person> out = mapper.reader(schema).readValue(lines.toString()); 
     return out; 
    } 

私は直接ストリームを読み取るMultipartFileこのようにisnteadを取り扱う理由で非常に簡単ですファイルとマッパーの間の不一致の行区切り文字の問題を解消しています(私はWindows上で作業します[私はダウン投票しません:]、マッパーのデフォルト行区切り文字は\n

データファイルは、この

のfirstName、lastNameの、年齢である

"ポール"、 "スミス"、 "22"

"ジェーン"、 "粗野"、 "98"

引用符を追加して削除しようとしました(デフォルトの文字列区切り記号)。私は年齢番号の引用符を使わずに試してみた。喜びはありません!

私はdocumentation他のSOの質問とブログ投稿を見ました。運がない。

答えて

0

さて、私の同僚はそれを理解しました。

MappingIterator<Person> out = mapper.reader(schema).readValue(lines.toString());

残りは細かい

ある

MappingIterator<Person> out = mapper.reader(Person.class).with(schema).readValue(lines.toString());

に変更する必要があります

関連する問題