Необработанные ответы REST от Bing Translate с Java - PullRequest
2 голосов
/ 03 марта 2012

Я собираю Java-клиент для Bing Translate, используя их REST API. Я могу аутентифицироваться с OAuth и без проблем выполнять переводы, без проблем распаковывая эти простые ответы String в объекты JAXB.

Однако, когда дело доходит до более сложных типов, я изо всех сил пытаюсь понять, почему я постоянно получаю нулевое значение в поле моего Java-объекта. Ответ, который я получаю от сервиса:

  <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;
  }

}

В отчаянии я заменил @XmlElement (name = "string") на @XmlAnyElement и получил список строк, но без значений.

Итак, мой вопрос - что нужно изменить для корректной интерпретации приведенного выше XML, и что более важно, почему?

1 Ответ

1 голос
/ 04 марта 2012

В вашем примере ваши 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;

вместо.

...