2009-10-26 55 views
3

我一直在試圖將我的腦袋繞過POST 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" } } } 

在服務,我使用DateCriteria的單個元素列表來獲取MultCriteria對象。奇怪的是,我必須傳遞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的翻譯。