JAX-WS - как создать элемент типа xs: любой из кода на стороне сервера? - PullRequest
2 голосов
/ 23 июля 2011

Я создал схему XML для своего веб-сервиса, и элемент для ServerResponse содержит неограниченную последовательность элементов типа xs: any.

Я генерирую классы (используя xjc) из моей схемы, и поэтому эта последовательность преобразуется в List в сгенерированном классе ServerResponse.

В классе ServerResponse есть метод getAny (), который возвращает этот список и позволяет мне вносить в него изменения ... но я не могу понять, как именно это сделать.

Скажем, я хочу добавить пару элементов в последовательность любых объектов в ответе, чтобы XML ответа содержал это.

<someelement1>sometext</someelement1>
<someelement2>somemoretext</someelement2>

из кода на стороне сервера Java, как бы я добавил эти два элемента в объект getAny ()? Я думал, что это можно сделать примерно так:

Object element = new Object();
((Element)element).setNodeValue("someelement1");
((Element)element).setTextContent("sometext");
requestobject.getAny().add(element);

Однако это не работает, так как выдает ошибку, утверждающую, что «java.lang.object не может быть приведен к org.w3.dom.Element».

Может кто-нибудь помочь мне сделать это? Я уверен, что есть довольно простое решение!

Спасибо за любую помощь:)

1 Ответ

4 голосов
/ 23 июля 2011

Object не реализует Element, поэтому этот бросок всегда будет неудачным.

Вы можете создавать Element экземпляров, используя DocumentBuilder, которые вы можете получить из DocumentBuilderFactory.

Вот пример кода JAXB:

@XmlRootElement
public class Anything {
  private Object any;

  @XmlAnyElement
  public Object getAny() { return any; }
  public void setAny(Object any) { this.any = any; }

  public static void main(String[] args) throws DOMException,
      ParserConfigurationException {
    Element foo = DocumentBuilderFactory.newInstance()
        .newDocumentBuilder()
        .newDocument()
        .createElement("foo");
    Anything a = new Anything();
    a.setAny(foo);
    JAXB.marshal(a, System.out);
  }
}

Я не пробовал это в JAX-WS (JAX-WS использует привязки JAXB) - если это не сработает, я бы начал копаться вокруг javax.xml.soap пакет.

...