Jersey 客户端在 XML 反序列化期间未设置字段
Jersey client not setting fields during XML deserialization
我正在设置 Jersey JAX-RS 客户端以反序列化 .NET Web API 服务提供的 XML。我遇到了一个障碍,我正在打电话获取一组对象。我可以在 Jersey 客户端上接收集合,但是,正在设置对象上的 none 个字段。
XML:
<?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>
客户class:
@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER)
@XmlType(name="Event")
public class Event {
public int Id;
public int MeetingId;
public String Name;
@Override
public String toString(){
return String.format("%s, %s, %s", Id, MeetingId, Name);
}
}
客户代码:
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());
}
打印结果:
0, 0, null
0, 0, null
0, 0, null
我尝试将@XmlElement 添加到属性并指定名称,但没有成功。我还回顾了这些问题:
Jersey client xml collection
Jersey jax-rs client xml to java list deserialization
它们看起来很直接,但我得不到相同的结果。从第一个问题开始,在 Event class 上使用 XmlRootElement 会引发异常。第二个问题是什么导致我正确反序列化集合,但缺少字段数据。
如何设置它以正确反序列化字段?
编辑:我也尝试过使用根元素来做到这一点。
根元素class:
@XmlRootElement(name="ArrayOfEvent", namespace="http://schemas.datacontract.org/2004/07/TestApi.Models")
@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER)
public class EventSearch {
public List<Event> Events;
}
客户class:
WebTarget target = client.target(baseUrl);
target = target.path("Event");
EventSearch search = target.request(MediaType.APPLICATION_XML).get(EventSearch.class);
当我这样做时,EventSearch 上的 Events 字段为空,所以我什至没有反序列化集合。
默认情况下,JAXB 会将名为 Id
的字段转换为名为 id
的元素,以获取您需要的元素名称,您需要使用 @XmlElement
注释。
@XmlElement(name="Id")
public int Id;
您还需要映射命名空间限定。这是使用包级别 @XmlSchema
注释完成的。为此,请在与您的模型相同的包中添加一个名为 package-info.java
的源文件,其中包含以下内容(修改包以匹配您自己的包)。
@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;
我在我的博客上写了更多关于 JAXB 和名称空间限定的文章:
我正在设置 Jersey JAX-RS 客户端以反序列化 .NET Web API 服务提供的 XML。我遇到了一个障碍,我正在打电话获取一组对象。我可以在 Jersey 客户端上接收集合,但是,正在设置对象上的 none 个字段。
XML:
<?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>
客户class:
@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER)
@XmlType(name="Event")
public class Event {
public int Id;
public int MeetingId;
public String Name;
@Override
public String toString(){
return String.format("%s, %s, %s", Id, MeetingId, Name);
}
}
客户代码:
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());
}
打印结果:
0, 0, null
0, 0, null
0, 0, null
我尝试将@XmlElement 添加到属性并指定名称,但没有成功。我还回顾了这些问题:
Jersey client xml collection
Jersey jax-rs client xml to java list deserialization
它们看起来很直接,但我得不到相同的结果。从第一个问题开始,在 Event class 上使用 XmlRootElement 会引发异常。第二个问题是什么导致我正确反序列化集合,但缺少字段数据。
如何设置它以正确反序列化字段?
编辑:我也尝试过使用根元素来做到这一点。
根元素class:
@XmlRootElement(name="ArrayOfEvent", namespace="http://schemas.datacontract.org/2004/07/TestApi.Models")
@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER)
public class EventSearch {
public List<Event> Events;
}
客户class:
WebTarget target = client.target(baseUrl);
target = target.path("Event");
EventSearch search = target.request(MediaType.APPLICATION_XML).get(EventSearch.class);
当我这样做时,EventSearch 上的 Events 字段为空,所以我什至没有反序列化集合。
默认情况下,JAXB 会将名为 Id
的字段转换为名为 id
的元素,以获取您需要的元素名称,您需要使用 @XmlElement
注释。
@XmlElement(name="Id")
public int Id;
您还需要映射命名空间限定。这是使用包级别 @XmlSchema
注释完成的。为此,请在与您的模型相同的包中添加一个名为 package-info.java
的源文件,其中包含以下内容(修改包以匹配您自己的包)。
@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;
我在我的博客上写了更多关于 JAXB 和名称空间限定的文章: