2009-10-26 3 views
3

Я пытался обвести голову POSTing json в службу REST и пространства имен JAXB. Я использую Resteasy, чтобы пометить метод на стороне сервера. У меня есть следующие услуги:REST + json + JAXB + пространства имен

@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

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

Смежные вопросы