Я собираю 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, и что более важно, почему?