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 和名称空间限定的文章: