[英]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.