RESTful WSを介して1つのアプリから別のアプリにデータを取得しようとしていますが、機能しますが、キャストできないため、このデータを使用できません... WSは次のようなオブジェクトのリストを返します。
{id=1, forename=John, surname=Bloggs, username=jbloggs, role=Graduate Developer, office=London, skills=[{technology=Java, experience=2.5}, {technology=Web, experience=2.0}, {technology=iOS, experience=0.0}, {technology=.NET, experience=0.0}]}
取得するには、JacksonのObjectMapperを使用します。
ObjectMapper mapper = new ObjectMapper();
List<ConsultantDto> list = new ArrayList<ConsultantDto>();
try {
list = mapper.readValue(con.getInputStream(), ArrayList.class);
} catch (JsonGenerationException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
その後、3行のコードがあります。
System.out.println(list.get(0));
System.out.println(list.get(0).getForename());
return list;
このメソッドの戻り値は、ブラウザに正しいデータを表示する他のWebサービスに渡されるためです。2つの印刷行で興味深いことが起こります。1つはこの投稿の先頭からデータを印刷しますが({id:1 ...})、もう1つは例外をスローします。
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.xxx.xxx.web.dto.rp.ConsultantDto
ConsultantDtoとSkillDtoは、すべてのプロパティがWSからのデータと一致するように設定された2つの正当なクラスであり、すべてのゲッター/セッターが配置されています。私に関する限り、LinkedHashMapはものをキーと値のペアとして格納するため、この例外がどこから発生するのかわかりません。どうすれば修正できますか。ObjectMapperが値を正しく解析しないのはなぜですか(リストではなく単一のConsultantDtoを取得した場合に実行されます)。
これを行う必要があります:
List<ConsultantDto> myObjects =
mapper.readValue(jsonInput, new TypeReference<List<ConsultantDto>>(){});
(このSOの答えから)
使用しなければならない理由TypeReference
は、Javaの不運な癖のためです。Javaに適切なジェネリックスがあれば、構文は機能したと思います。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加