REST + JSON + JAXB + пространства имен - PullRequest
3 голосов
/ 26 октября 2009

Я пытался обернуть голову вокруг POSTing 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" } } }

На сервисе я получаю объект MultCriteria с одним списком элементов DateCriteria. Странно, но я должен передать пространство имен в объекте JSON, хотя я пометил службу картой в пустом пространстве имен.

Если я попытаюсь отправить массив следующим образом:

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

Я получаю объект MultCriteria с пустым списком DateCriteria. Если я изменю объект DateCriteria так, чтобы он имел пустое пространство имен, то приведенный выше синтаксис работает нормально.

Кто-нибудь видит, что я здесь делаю не так? Как настроить пространства имен и как правильно передать их службе?

1 Ответ

1 голос
/ 28 октября 2009

В простом 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.

...