JAXB不使用Jersey编组嵌套对象

JAXB不使用Jersey编组嵌套对象,jaxb,jersey,Jaxb,Jersey,Devices.java import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.WebResource; public class App { public static void main(String[] args){ Client client = Client.create

Devices.java

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;

public class App {
    public static void main(String[] args){
        Client client = Client.create();
        WebResource webResource = client.resource("https://mywebsite.com/getDevices");
        ClientResponse response = webResource.accept("application/xml").get(
                ClientResponse.class);
        System.out.println(response.getEntity(Devices.class));
    }
}
import java.util.ArrayList;
导入java.util.List;
导入javax.xml.bind.annotation.XmlAccessType;
导入javax.xml.bind.annotation.XmlAccessorType;
导入javax.xml.bind.annotation.xmlement;
导入javax.xml.bind.annotation.XmlRootElement;
导入javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(namespace=“myNamespace”,propOrder={“deviceList”})
@XmlRootElement(name=“Entries”,namespace=“myNamespace”)
公共类设备{
@xmlement(name=“Entry”,namespace=“myNamespace”)
受保护列表设备列表;
公共列表getEntry(){
if(deviceList==null){
deviceList=新的ArrayList();
}
返回这个.deviceList;
}
@凌驾
公共字符串toString(){
return deviceList.toString();
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={“devicename”})
公共静态类设备{
字符串设备名;
公共字符串getDevicename(){
返回设备名称;
}
public void setDevicename(字符串值){
this.devicename=值;
}
@凌驾
公共字符串toString(){
返回设备名称;
}
}
}
从Web服务返回的示例XML

import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(namespace="myNamespace", propOrder = {"deviceList"})
@XmlRootElement(name = "Entries", namespace="myNamespace")
public class Devices {

    @XmlElement(name = "Entry", namespace="myNamespace")
    protected List<Devices.Device> deviceList;

    public List<Devices.Device> getEntry() {
        if (deviceList == null) {
            deviceList = new ArrayList<Devices.Device>();
        }
        return this.deviceList;
    }

    @Override
    public String toString() {
        return deviceList.toString();
    }

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(propOrder = {"devicename"})
    public static class Device {
        String devicename;

        public String getDevicename() {
            return devicename;
        }

        public void setDevicename(String value) {
            this.devicename = value;
        }

        @Override
        public String toString() {
            return devicename;
        }
    }
}

设备1
设备2

它似乎正确地拉入了数据,但为每个devicename返回null。

您可以在名为
包信息
的类上使用包级别的
@XmlSchema
注释,而不是当前映射命名空间限定的方式,该注释如下所示:

package info.java

<Entries xmlns="myNamespace">
  <Entry><devicename xmlns="myNamespace">Device1</devicename></Entry>
  <Entry><devicename xmlns="myNamespace">Device2</devicename></Entry>
</Entries>
了解更多信息


完美。有趣的是,我昨天读了那个博客,在Eclipse中发现了一些错误。今天天气很好。非常感谢。
@XmlSchema(
    namespace = "myNamespace",
    elementFormDefault = XmlNsForm.QUALIFIED)
package your.pkg;

import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;