繁体   English   中英

jaxb解组给null属性

[英]jaxb unmarshalling giving null attributes

我试图解组对Java对象的XML响应,尽管解组进行得很好,但是Java对象的属性设置为null。

这是回应:

<ams:fault>
   <ams:code>900905</ams:code>
   <ams:message>Incorrect Access Token Type is provided</ams:message>
   <ams:description>Access failure for API: /stockquote, version: 1.0.0 with 
 key: lI2XVmmRJ9_B_rbh1rwV7Pg3Pp8a</ams:description>
</ams:fault>

以下是我试图捕获解组内容的Java类:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "fault", namespace = "http://wso2.org/apimanager/security")
public class SMSAuthFault
{
    @XmlElement(name = "code")
    private String code;

    @XmlElement(name = "message")
    private String message;

    @XmlElement(name = "description")
    private String description;

    public String getCode()
    {
        return code;
    }

    public void setCode(String code)
    {
        this.code = code;
    }

    public String getMessage()
    {
        return message;
    }

    public void setMessage(String message)
    {
        this.message = message;
    }

    public String getDescription()
    {
        return description;
    }

    public void setDescription(String description)
    {
        this.description = description;
    }

    @Override
    public String toString()
    {
        return "SMSAuthFault [code=" + code + ", message=" + message
                + ", description=" + description + "]";
    }

}

这是我试图解组此响应的方式:

JAXBContext jaxb = JAXBContext.newInstance(SMSAuthFault.class);
Unmarshaller unmarshaller = jaxb.createUnmarshaller();
System.out.println(unmarshaller.unmarshal(new StringReader(m)));

针对以上尝试打印的响应:

SMSAuthFault [code=null, message=null, description=null]

从Undocshaller的javadoc https://docs.oracle.com/javase/7/docs/api/javax/xml/bind/Unmarshaller.html

使用javax.xml.transform.stream.StreamSource从StringBuffer解组:

   JAXBContext jc = JAXBContext.newInstance( "com.acme.foo" );
   Unmarshaller u = jc.createUnmarshaller();
   StringBuffer xmlStr = new StringBuffer( "<?xml version="1.0"?>...");
   Object o = u.unmarshal( new StreamSource( new StringReader( xmlStr.toString() ) ) );

尝试使用StreamSource对象包装StringReader

试试这个代码:

package org.softdevelop.unmarshall;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

/**
 * Created by Jorge on 16/10/2017.
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "fault", namespace = "http://wso2.org/apimanager/security")
public class SMSAuthFault
{
    @XmlElement(name = "code")
    private String code;

    @XmlElement(name = "message")
    private String message;

    @XmlElement(name = "description")
    private String description;

    public String getCode()
    {
        return code;
    }

    public void setCode(String code)
    {
        this.code = code;
    }

    public String getMessage()
    {
        return message;
    }

    public void setMessage(String message)
    {
        this.message = message;
    }

    public String getDescription()
    {
        return description;
    }

    public void setDescription(String description)
    {
        this.description = description;
    }

    @Override
    public String toString()
    {
        return "SMSAuthFault [code=" + code + ", message=" + message
                + ", description=" + description + "]";
    }

}

我的主班:

package org.softdevelop.unmarshall;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.io.StringReader;

/**
 * Created by Jorge on 16/10/2017.
 */
public class Unmarshall {

    public static void main(String [] arg) throws JAXBException, ParserConfigurationException, IOException, SAXException {
        JAXBContext jaxb = JAXBContext.newInstance(SMSAuthFault.class);
        Unmarshaller um = jaxb.createUnmarshaller();
        String m = "<ams:fault xmlns:ams=\"http://some.uri.net/\">\n" +
                "   <ams:code>900905</ams:code>\n" +
                "   <ams:message>Incorrect Access Token Type is provided</ams:message>\n" +
                "   <ams:description>Access failure for API: /stockquote, version: 1.0.0 with \n" +
                " key: lI2XVmmRJ9_B_rbh1rwV7Pg3Pp8a</ams:description>\n" +
                "</ams:fault>";

        StringReader sr = new StringReader(m);
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        dbf.setNamespaceAware(true);
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(new InputSource(sr));
        Node n = (Node) doc.getDocumentElement();
        JAXBElement<SMSAuthFault> personElement = um.unmarshal(n, SMSAuthFault.class);
        SMSAuthFault smsF = personElement.getValue();
        System.out.println(smsF);
    }
}

我的输出:

SMSAuthFault [code=900905, message=Incorrect Access Token Type is provided, description=Access failure for API: /stockquote, version: 1.0.0 with 
 key: lI2XVmmRJ9_B_rbh1rwV7Pg3Pp8a]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM