Java Jersey客户端在XML反序列化期间未设置字段
我正在设置Jersey JAX-RS客户机,以反序列化.NETWebAPI服务提供的XML。我遇到了一个路障,我打电话去收集一些东西。我能够在Jersey客户端上接收集合,但是,没有设置对象上的任何字段 XML:Java Jersey客户端在XML反序列化期间未设置字段,java,xml,jaxb,jersey,jax-rs,Java,Xml,Jaxb,Jersey,Jax Rs,我正在设置Jersey JAX-RS客户机,以反序列化.NETWebAPI服务提供的XML。我遇到了一个路障,我打电话去收集一些东西。我能够在Jersey客户端上接收集合,但是,没有设置对象上的任何字段 XML: <?xml version="1.0"?> <ArrayOfEvent xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07
<?xml version="1.0"?>
<ArrayOfEvent xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/TestApi.Models">
<Event>
<Id>3</Id>
<MeetingId>444</MeetingId>
<Name>Jon's Meeting</Name>
</Event>
<Event>
<Id>134</Id>
<MeetingId>234</MeetingId>
<Name>Super meeting</Name>
</Event>
<Event>
<Id>43</Id>
<MeetingId>9966</MeetingId>
<Name>Test meeting!</Name>
</Event>
</ArrayOfEvent>
客户端代码:
WebTarget target = client.target(baseUrl);
target = target.path("Event");
List<Event> events = target.request(MediaType.APPLICATION_XML).get(new GenericType<List<Event>>() {});
for (Event e: events){
System.out.println(e.toString());
}
我曾尝试将@XmlElement添加到属性并指定名称,但没有成功。我还回顾了这些问题:
他们似乎很直截了当,但我不能得到同样的结果。从第一个问题开始,在事件类上使用XmlRootElement会引发异常。第二个问题是什么导致我正确地反序列化了集合,但丢失了字段数据
如何设置此选项以正确反序列化字段
编辑:我也尝试过使用根元素进行编辑
根元素类:
@XmlRootElement(name="ArrayOfEvent", namespace="http://schemas.datacontract.org/2004/07/TestApi.Models")
@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER)
public class EventSearch {
public List<Event> Events;
}
当我这样做时,EventSearch上的Events字段为空,因此我甚至没有对集合进行反序列化。默认情况下,JAXB会将名为
Id
的字段转换为名为Id
的元素,以获取所需的元素名称。您需要使用@xmlement
注释
@XmlElement(name="Id")
public int Id;
您还需要映射名称空间限定。这是使用包级别的@XmlSchema
注释完成的。为此,在与模型相同的包中添加一个名为package info.java
的源文件,其中包含以下内容(修改包以匹配您自己的内容)
我在我的博客上写了更多关于JAXB和名称空间限定的内容:
@XmlRootElement(name="ArrayOfEvent", namespace="http://schemas.datacontract.org/2004/07/TestApi.Models")
@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER)
public class EventSearch {
public List<Event> Events;
}
WebTarget target = client.target(baseUrl);
target = target.path("Event");
EventSearch search = target.request(MediaType.APPLICATION_XML).get(EventSearch.class);
@XmlElement(name="Id")
public int Id;
@XmlSchema(
namespace = "http://schemas.datacontract.org/2004/07/TestApi.Models",
elementFormDefault = XmlNsForm.QUALIFIED)
package your_package;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;