私はJerseyを使用して、サーバーコンポーネント用のRESTWebサービスを作成しています。
リストでシリアル化したいJAXB注釈付きオブジェクトは次のようになります。
@XmlRootElement(name = "distribution")
@XmlType(name = "tDistribution", propOrder = {
"id", "name"
})
public class XMLDistribution {
private String id;
private String name;
// no-args constructor, getters, setters, etc
}
次のような1つのディストリビューションを取得するためのRESTリソースがあります。
@Path("/distribution/{id: [1-9][0-9]*}")
public class RESTDistribution {
@GET
@Produces("application/json")
public XMLDistribution retrieve(@PathParam("id") String id) {
return retrieveDistribution(Long.parseLong(id));
}
// business logic (retrieveDistribution(long))
}
また、すべてのディストリビューションのリストを取得するためのRESTリソースがあります。これは次のようになります。
@Path("/distributions")
public class RESTDistributions {
@GET
@Produces("application/json")
public List<XMLDistribution> retrieveAll() {
return retrieveDistributions();
}
// business logic (retrieveDistributions())
}
ContextResolverを使用してJAXBシリアル化をカスタマイズします。これは、現在次のように構成されています。
@Provider
@Produces("application/json")
public class JAXBJSONContextResolver implements ContextResolver<JAXBContext> {
private JAXBContext context;
public JAXBJSONContextResolver() throws Exception {
JSONConfiguration.MappedBuilder b = JSONConfiguration.mapped();
b.nonStrings("id");
b.rootUnwrapping(true);
b.arrays("distribution");
context = new JSONJAXBContext(b.build(), XMLDistribution.class);
}
@Override
public JAXBContext getContext(Class<?> objectType) {
return context;
}
}
両方のRESTリソースと、コンテキストリゾルバーが機能します。これは、最初のものの出力の例です。
// path: /distribution/1
{
"id": 1,
"name": "Example Distribution"
}
それはまさに私が欲しいものです。これは、リストの出力例です。
// path: /distributions
{
"distribution": [{
"id": 1,
"name": "Sample Distribution 1"
}, {
"id": 2,
"name": "Sample Distribution 2"
}]
}
これは私が望んでいることではありません。
distribution
なぜそこに囲みタグがあるのかわかりません。.rootUnwrapping(true)
コンテキストリゾルバーでそれを削除したかったのですが、どうやらそれは別の囲んでいるタグを削除するだけです。これは次の出力.rootUnwrapping(false)
です:
// path: /distribution/1
{
"distribution": {
"id": 1,
"name": "Example Distribution"
}
} // not ok
// path: /distributions
{
"xMLDistributions": {
"distribution": [{
"id": 1,
"name": "Sample Distribution 1"
}, {
"id": 2,
"name": "Sample Distribution 2"
}]
}
}
.arrays("distribution")
また、要素が1つしかない場合でも、常にJSON配列を取得するように構成する必要がありました。
理想的には、これを出力として使用したいと思います。
// path: /distribution/1
{
"id": 1,
"name": "Example Distribution"
} // currently works
// path: /distributions
[{
"id": 1,
"name": "Sample Distribution 1"
}, {
"id": 2,
"name": "Sample Distribution 2"
}]
List<XMLDistribution>
、XMLDistributionList
(リストのラッパー)、、を返そうとしましたXMLDistribution[]
が、必要な形式でディストリビューションの単純なJSON配列を取得する方法が見つかりませんでした。
JSONConfiguration.natural()
、などによって返される他の表記法も試しましたがJSONConfiguration.mappedJettison()
、必要なものに似たものを取得できませんでした。
これを行うようにJAXBを構成できるかどうか誰かが知っていますか?