3

私はjsonをRESTサービスとJAXB名前空間にPOSTすることに頭を悩ませようとしています。Resteasy を使用してサーバー側のメソッドをマークアップしています。次のサービスがあります。

@POST
@Mapped(namespaceMap={@XmlNsMap(namespace="http://acme.com", jsonName=""))
@Path("/search")
@Consumes("application/json")
public List<I> search(SearchCriteria crit);

次のオブジェクトがあります。

@XmlRootElement(namespace="http://acme.com")
public class DateCriteria {
    @XmlElement
    private Date start;
    @XmlElement
    private Date end;
}


@XmlRootElement(namespace="http://acme.com")
public class MultCriteria {
    @XmlElementRefs({@XmlElementRef(type=DateCriteria.class)})
    private List<DateCriteria> dateCriterias;
}

投稿で次の JSON を送信でき、機能します。

{ "acme.MultCriteria": { "acme.DateCriteria": { startDate: "2009/01/01", endDate: "2009/01/01" } } }

このサービスでは、DateCriteria の単一要素リストを持つ MultCriteria オブジェクトを取得します。奇妙なことに、サービスを空の名前空間へのマップでマークしたにもかかわらず、JSON オブジェクトで名前空間を渡す必要があります。

次のように配列を送信しようとすると:

{ "acme.MultCriteria": { "acme.DateCriteria": [ { startDate: "2009/01/01", endDate: "2009/01/01" }, { startDate: "2009/01/01", endDate: "2009/01/01" } ] } }

DateCriteria のリストが空の MultCriteria オブジェクトを取得します。空の名前空間を持つように DateCriteria オブジェクトを変更すると、上記の構文は正常に機能します。

ここで私が間違っていることを誰かが見ていますか? 名前空間はどのようにセットアップする必要がありますか?また、それらをサービスに適切に渡すにはどうすればよいですか?

4

1 に答える 1

1

プレーンJAXBでは、クラスに。でアノテーションを付けると@XmlRootElement(namespace="http://acme.com")、名前空間宣言がすべての子要素に自動的に適用されるわけではありません。各フィールドに明示的に設定する必要があります。例:

@XmlRootElement(namespace="http://acme.com")
public class MultCriteria {
    @XmlElement(name="DateCriteria", namespace="http://acme.com")
    private List<DateCriteria> dateCriterias;
}

これがRESTeasyとどのように相互作用するかについては、私はJSON-JAXB変換に精通していないとは言えません。

于 2009-10-28T13:57:57.050 に答える