有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

提供空属性的java jaxb解组

我试图将XML响应解组到Java对象,尽管解组过程很顺利,但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]

共 (2) 个答案

  1. # 1 楼答案

    请尝试以下代码:

    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]
    
  2. # 2 楼答案

    来自javadoc的解组器 https://docs.oracle.com/javase/7/docs/api/javax/xml/bind/Unmarshaller.html

    使用javax从StringBuffer解组。xml。使改变流动资料来源:

       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