わかりました。最初に、Web サービスから返される JSON を示します。Android ContentProvider の ResponseHandler で非同期クエリを実行した後、それを pojos に逆シリアル化しようとしています。
{"exampleList" : [{
"locationId" : "00001" ,
"owners" : [
{
"paidID" : { "$oid" : "50a9c951300493f64fbffdb6"} ,
"userID" : { "$oid" : "50a9c951300493f64fbffdb6"}
} ,
{
"paidID" : { "$oid" : "50a9c951300493f64fbffdb7"} ,
"userID" : { "$oid" : "50a9c951300493f64fbffdb7"}
}
]
}]}
最初は、Android アプリと同じように Web サービスに Jackson アノテーション付きの Bean を使用しているため、この問題に戸惑いましたがowners
、サンプルの JSON でオブジェクトが送信されていないことに気付きました。 Web サービスに追加します (Web サービスの POJO をスキップし、DAO からのアトミック更新によって mongoDB のドキュメントに追加されます)。
じゃあ良いよ。これまで、Jackson はowners
オブジェクトを処理する必要がありませんでした。
JsonMappingException
:参照チェーン [所有者クラスを含むジャクソン Bean へのパス] を介して [見つけられる文字位置] で、トークンjava.lang.String
外の インスタンスをデシリアライズできませんSTART_OBJECT
"userID"
"paidID"
私のJackson Beanにはラッパーがあり、これが「exampleList」のすべてです。
public class Examples extends HashMap<String, ArrayList<Example>> {
}
そして、実際のExample
クラス:
@JsonIgnoreProperties(ignoreUnknown = true)
public class Example implements Comparable<Example> {
@ObjectId @Id
private String id;
@JsonProperty(Constants.Example.location)
private String location;
@JsonProperty(Constants.Example.OWNERS)
private List<Owners> owners;
public int compareTo(Example _o) {
return getId().compareTo(_o.getId());
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public List<Example.Owners> getOwners() {
return owners;
}
public void setOwners(List<Example.Owners> owners) {
this.owners = owners;
}
public Example() {
}
@JsonCreator
public Example(@Id @ObjectId String id) {
this.id = id;
}
@JsonIgnoreProperties(ignoreUnknown = true)
public static class Owners implements Comparable<Owners> {
@JsonProperty(Constants.Example.USERID)
private String userID;
@JsonProperty(Constants.Example.PAIDID)
private String paidID;
public Owners() {
}
public int compareTo(Owners _o) {
return getUserID().compareTo(_o.getUserID());
}
@ObjectId
public String getUserID() {
return userID;
}
@ObjectId
public void setUserID(String userID) {
this.userID = userID;
}
@ObjectId
public String getPaidID() {
return paidID;
}
@ObjectId
public void setPaidID(String paidID) {
this.paidID = paidID;
}
}
}
そして最後に、これがすべて失敗している ResponseHandler のコード (2 行目で JsonMappingException が生成されます):
objectMapper = MongoJacksonMapperModule.configure(objectMapper);
mExamples = objectMapper.readValue(jsonParser, Examples.class);
$oid
問題は、JacksonがまだmongoDB ObjectIdsであるそれらをマップする方法を知らないということだと感じています。MongoJacksonMapper ライブラリは、@ObjectId
アノテーションと、そのライブラリを使用するように ObjectMapper を構成する方法を提供することで、これを支援するはずですが、まだ機能していません。何らかの理由で、ObjectId ではなく文字列として userID または payedID を検索しています。何か案は?