3

我一直试图围绕将 json 发布到 REST 服务和 JAXB 命名空间。我正在使用 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 回答