【问题标题】:Java WS: how to build a ElementNSImpl from a model object?Java WS:如何从模型对象构建 ElementNSImpl?
【发布时间】:2016-09-27 07:58:31
【问题描述】:

我有一个应用程序,它是一个使用 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 不会解析的内部内容(特定部分);我将在使用编组器调用的每个服务的特定部分对其进行解析,并让他知道必须使用哪个特定模型:

@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 不向客户端返回任何内容(长度为 0 的 200 HTTP 响应)......

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

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

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

【问题讨论】:

    标签: java xml web-services jaxb


    【解决方案1】:

    嗯,我不是最好的一天:

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

    这样我可以在每次调用不同服务时调用它,并且在那里我会知道必须使用哪个特定类。

    【讨论】:

      猜你喜欢
      • 2018-07-20
      • 2019-02-06
      • 1970-01-01
      • 2019-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-25
      • 2012-06-11
      相关资源
      最近更新 更多