【发布时间】: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