从Bing翻译与Java解组REST响应

时间:2012-03-03 10:56:35

标签: java rest jaxb bing

我正在使用他们的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需要改变什么,更重要的是为什么?

1 个答案:

答案 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;

代替。