2009-10-26 89 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的翻译。