我有一个应用程序,它是一个使用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注释的对象构建它。
答案 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();
}
通过这种方式,我可以在不同的服务中调用它,在那里,我将知道必须使用哪个特定类。