与えられた POJO:
@XmlRootElement
public class Categories implements Serializable {
private int id;
private String name;
private Categories parent;
// ....
}
次のjsonにシリアル化したいと思います:
{ id: 1, name: "some name", parent: 5 }
したがって、ここでの主な課題は、親オブジェクトをその ID として表すことです。逆シリアル化にも同じことが必要です。
かなり大きな Jackson wiki をスキャンしましたが、大量のカスタム コードを書かなくてもこれを達成できるものは見つかりませんでした。これはかなり一般的なタスクであり、解決策は近くにあるはずだと思います。
また、ソリューションが null 値のケースをカスタマイズできるようになるとよいでしょう。
更新:
今XmlTypeAdapter
、approch を使用しようとしていますが、それに満足していません。なぜなら、私が持っているすべての単一の型に対して TypeAdapter を記述する必要があり、それらすべてにほぼ同じコードが含まれるからです。
public class CategoriesTypeAdapter extends XmlAdapter<Integer, Categories> {
@Inject
CategoriesFacade dao;
@Override
public Categories unmarshal(Integer v) throws Exception {
return dao.find(v);
}
@Override
public Integer marshal(Categories v) throws Exception {
return v.getId();
}
}
Categories.java の変更:
@XmlJavaTypeAdapter(CategoriesTypeAdapter.class)
private Categories parent;
UPD1:
そして、これも私にとってはうまくいきません。少なくともデシリアライズすると、常にオブジェクトの代わりに null が返されます。これをデバッグする方法がわかりません。この JSON の場合:
{ id: 1, name: "test", parent: 5 }
私は親を常にnullにするようになりました:
Categories{categoryId=1, name="test", parentId=null}
UPD2:
私は、この問題での失敗が原因であることがわかりました。適切にセットアップしていなかっただけで、私の web.xml には次のエントリがありませんでした。
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.neopod.rest</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
</servlet>