代码之家  ›  专栏  ›  技术社区  ›  J-J

无法从映射JSON响应到POJOcom.sun.jersey泽西岛.api.client.ClientResponse客户端

  •  0
  • J-J  · 技术社区  · 6 年前

    我试图将一个JSON响应映射到一个POJO,一些属性(属性以@开头)无法映射,因此出现以下错误。

    请查找JSON和类文件,在POJO上要做什么更改来映射下面提到的JSON的所有属性?

    {
      "@customerId": "123456",
      "customerName": "Jobin",
      "orders": [
        {
          "orderId": "bvbundle002075",
          "address": {
            "@elid": "35475908"
          },
    
        }
      ]
    }
    

    客户.java

    import java.util.List;
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlRootElement;
    import javax.xml.bind.annotation.XmlType;
    
    @XmlRootElement
    @XmlType
    public class CustomerData implements Serializable {
    
        private static final long serialVersionUID = 9163262900343406982L;
    
        private String customerId;
        private String customerName;
        private List<Order> orders;
    
        @XmlElement(name = "@customerId")
        public String getCustomerId() {
            return customerId;
        }
    
        public void setCustomerId(final String customerId) {
            this.customerId = customerId;
        }
    
    
        public String getCustomerName() {
            return customerId;
        }
    
        public void setCustomerName(final String customerName) {
            this.customerName = customerName;
        }
    
        public List<Order> getOrders() {
            return orders;
        }
    
        public void setExistingProducts(final List<Order> orders) {
            this.orders = orders;
        }
    }
    

    class Order implements Serializable {
    
        private static final long serialVersionUID = 1L;
        private String orderId;
        private Address address;
    
        public String getOrderId() {
            return orderId;
        }
    
        public void setOrderId(final String orderId) {
            this.orderId = orderId;
        }
    
        public Address getAddress() {
            return address;
        }
    
        public void setAddress(final Address address) {
            this.address = address;
        }
    }
    

    地址.java

    class Address implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        private String elid;
    
        @XmlElement(name = "@elid")
        public String getElid() {
            return elid;
        }
    
        public void setElid(String elid) {
            this.elid = elid;
        }
    }
    

    错误日志

    javax.ws.rs.WebApplicationException: javax.xml.bind.UnmarshalException
     - with linked exception:
    [javax.xml.stream.XMLStreamException: java.lang.NullPointerException]
        at com.sun.jersey.core.provider.jaxb.AbstractRootElementProvider.readFrom(AbstractRootElementProvider.java:113)
        at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:634)
        at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:586)
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)
        at java.lang.Thread.run(Unknown Source)
    Caused by: javax.xml.bind.UnmarshalException: null
        at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.handleStreamException(Unknown Source)
        at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(Unknown Source)
        at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(Unknown Source)
        at com.sun.jersey.json.impl.BaseJSONUnmarshaller.unmarshalJAXBElementFromJSON(BaseJSONUnmarshaller.java:111)
        at com.sun.jersey.json.impl.BaseJSONUnmarshaller.unmarshalFromJSON(BaseJSONUnmarshaller.java:100)
        at com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider.readFrom(JSONRootElementProvider.java:154)
        at com.sun.jersey.core.provider.jaxb.AbstractRootElementProvider.readFrom(AbstractRootElementProvider.java:111)
        ... 144 common frames omitted
    Caused by: javax.xml.stream.XMLStreamException: java.lang.NullPointerException
        at com.sun.jersey.json.impl.reader.XmlEventProvider.processTokens(XmlEventProvider.java:421)
        at com.sun.jersey.json.impl.reader.XmlEventProvider.readNext(XmlEventProvider.java:466)
        at com.sun.jersey.json.impl.reader.JsonXmlStreamReader.next(JsonXmlStreamReader.java:506)
        at com.sun.xml.internal.bind.v2.runtime.unmarshaller.StAXStreamConnector.bridge(Unknown Source)
        ... 150 common frames omitted
    Caused by: java.lang.NullPointerException: null
        at com.sun.jersey.json.impl.reader.XmlEventProvider.processTokens(XmlEventProvider.java:315)
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   J-J    6 年前

    问题是我试图将一个xml属性映射到一个xml元素。如果您转换响应中提到的上述JSON,将生成如下XML。。

    <?xml version="1.0" encoding="UTF-8"?>
    <root customerId="123456">
       <customerName>Jobin</customerName>
       <orders>
          <element>
             <address elid="35475908" />
             <orderId>bvbundle002075</orderId>
          </element>
       </orders>
    </root>
    

    如你所见 customerId elid xml属性不是元素。

    所以我不得不用下面的方法来修复它,

    @XmlAttribute(name = "customerNumber")  //will map to @customerNumber in JSON
    @XmlAttribute(name = "elid")            //will map to @elid in JSON