jaxb unmarshalling给出null属性

时间:2017-10-16 16:48:00

标签: java xml jaxb wso2 jax-rs

我正在尝试解组对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>

下面是我尝试捕获unmarshall内容的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]

2 个答案:

答案 0 :(得分:0)

来自unmarshaller的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

答案 1 :(得分:0)

试试这段代码:

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]