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