Java WS:如何从模型对象构建ElementNSImpl?

时间:2016-09-27 07:58:32

标签: java xml web-services jaxb

我有一个应用程序,它是一个使用java JWS完成的WS调度程序,可以获取ws请求,选择必须调用哪些ws,调用它,获取响应,解析并将其返回给客户端。

为此,我有一个XML,其中包含一个与我的服务相关的信息的部分,另一部分包含必须调用的服务的特定信息,因此可能有两个不同的调用:

<petition>
    <generic><servicename>ws1</servicename></generic>
    <especific>.... whatever....</especific>
</petition>

<petition>
    <generic><servicename>ws2</servicename></generic>
    <especific>.... whatever needed for ws3....</especific>
</petition>

他们的回报;

<return>
  <generic><servicename>ws1</servicename></generic>
  <specific><city>bilbao</city></specific>
</return>


<return>
  <generic><servicename>ws2</servicename></generic>
  <specific>
   <person>
      <name>Olof</name>
   </person>
  </specific>
</return>

要做到这一点,我在我的模型的'特定'字段中使用了标签@XmlAnyElement(lax = false)(请愿和回复),因此,在我的服务中,我将所有呼叫作为'请愿书'内部(特定部分)内容不会被JWS解析;我将使用marshaller在每个服务的特定部分解析它,并让他知道必须使用哪个特定模型:

@XmlAccessorType(XmlAccessType.FIELD)
  @XmlType(name = "", propOrder = {})
  @XmlRootElement(name = "petition")
  public class Petition{
      ....
      @XmlAnyElement(lax=false)
      private Object specific;
      ....
  }

 (Same for the response object.)

当我从我调用的服务中获取对象并将其直接作为“特定”字段中的ElementNSImpl对象返回时,这很好用,但通常我必须解析它(通常我返回的特定对象不一样)返回给我的对象的类型)我无法做到。

在这种情况下,我必须创建一个新对象(从我想要返回的类型),用我获得的信息填充它并将其返回给我的客户端。好吧,我这样做,我在其中构建一个'响应'设置服务的特定数据对象并尝试返回它,但是然后WS返回任何内容(200 HTTP响应,长度:0)给客户端... < / p>

此外,如果我手动将响应的“特定”部分设置为“null”,则对象会被很好地编组并且我的客户会收到:

<response>
 <generic><servicename>ws2</servicename></generic>
</response>

所以我认为它正在等待'ElementNSImpl',但我不知道如何从JAXB注释的对象构建它。

1 个答案:

答案 0 :(得分:2)

嗯,我不是最好的一天:

ElementNSImpl它显然是Element的一个实现,所以唯一要做的就是将对象封送到一个元素并在'lax = false'中返回它。

这种方法可以做到:

public Element marshallToElement(Object specific, Class clazz) throws JAXBException{
        DOMResult res = null;
        JAXBContext ctx = JAXBContext.newInstance(clazz);
        Marshaller marshaller = ctx.createMarshaller();
        res = new DOMResult();
        marshaller.marshal(specific, res);
        return ((Document)res.getNode()).getDocumentElement();
    }

通过这种方式,我可以在不同的服务中调用它,在那里,我将知道必须使用哪个特定类。