我正在使用他们的REST API为Bing Translate整合一个Java客户端。我可以使用OAuth进行身份验证并运行完全没有问题的翻译,将这些简单的String响应解组为JAXB对象,没有任何问题。
但是,当谈到更复杂的类型时,我正在努力解决为什么我经常在Java对象的字段上获得null值。我从服务中得到的回应是:
<ArrayOfstring
xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<string>ar</string>
<string>bg</string>
<string>ca</string>
<string>zh-CHS</string>
<string>zh-CHT</string>
</ArrayOfstring>
我正在使用以下方法解组对象:
@SuppressWarnings("unchecked")
public static <T extends Object> T unmarshallObject(Class<T> clazz, InputStream stream)
{
T returnType = null;
try
{
JAXBContext jc = JAXBContext.newInstance(clazz);
Unmarshaller u = jc.createUnmarshaller();
returnType = (T) u.unmarshal(stream);
} catch (Exception e1)
{
e1.printStackTrace();
}
return returnType;
}
哪个适用于简单对象,所以我怀疑问题在于我正在尝试生成的复杂对象的注释。代码是:
package some.package;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlElements;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.XmlValue;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="ArrayOfstring", namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays")
public class ArrayOfString implements Serializable
{
@XmlElement(name="string", namespace="http://schemas.microsoft.com/2003/10/Serialization")
private List<String> string;
public List<String> getString()
{
return string;
}
public void setString(List<String> strings)
{
this.string = strings;
}
}
无奈之下,我用@XmlAnyElement替换了@XmlElement(name =“string”),我得到了一个字符串列表,但没有值。
所以,我的问题是 - 为了正确解释上述XML需要改变什么,更重要的是为什么?
答案 0 :(得分:1)
在您的示例中,您的string
元素实际上属于http://schemas.microsoft.com/2003/10/Serialization/Arrays
命名空间。
您的注释表示您期望http://schemas.microsoft.com/2003/10/Serialization
命名空间。
尝试
@XmlElement(name="string",
namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays")
private List<String> string;
代替。