JAX-WS - 如何从服务器端代码创建xs类型的元素?

时间:2011-07-23 13:06:14

标签: java xml web-services xsd jax-ws

我为我的webservice创建了一个XML模式,ServerResponse的元素包含xs:any的无限元素序列。

我正在从我的模式生成类(使用xjc),因此在生成的ServerResponse类中将此序列转换为List。

ServerResponse类有一个方法getAny(),它返回这个List并允许我对它进行更改..但我无法弄清楚到底是怎么做的。

假设我想在响应中的任何对象的序列中添加几个元素,以便响应的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 个答案:

答案 0 :(得分:4)

Object未实现Element,因此此演员表将始终失败。

您可以使用DocumentBuilder创建Element个实例,您可以从DocumentBuilderFactory获取。{/ p>

以下是一些示例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包。