java – JAX-WS响应消息中的可选部分
TL; DR:我怎样才能有一个可选的< part>在响应< message>为wsdl服务.
我是: >定位现有服务 问题: 使用以下服务定义,我可以定位服务的v1: <message name="CreateResponse"> <part name="ResourceCreated" element="ns7:ResourceCreated" /> </message> 这个与服务的v2一起使用: <message name="CreateResponse"> <part name="ResourceCreated" element="ns7:ResourceCreated" /> <part name="Shell" element="ns8:Shell" /> </message> 题: 细节: >服务是 解决方法
我不相信这个问题有一个干净的解决方案 – 不可能标记< part> < message>中的元素作为可选.
这种情况下的解决方法是在附加元素到达JAX??-WS解析器之前去掉它.这可以通过创建CXF拦截器或JAX-WS处理程序并操纵响应XML来完成. 创建JAX-WS处理程序: public class StripHandler implements SOAPHandler<SOAPMessageContext> { @Override public boolean handleMessage(SOAPMessageContext context) { boolean isResponse = Boolean.FALSE.equals(context.get (MessageContext.MESSAGE_OUTBOUND_PROPERTY)); if (isResponse) { QName action = (QName) context.get(SOAPMessageContext.WSDL_OPERATION); if ("Create".equals(action.getLocalPart())) { Iterator<?> childIter = getBodyChildren(context); while(childIter.hasNext()) { SOAPElement el = (SOAPElement) childIter.next(); if ("Shell".equals(el.getLocalName())) { childIter.remove(); } } } } return true; } private Iterator<?> getBodyChildren(SOAPMessageContext context) { try { SOAPEnvelope envelope = context.getMessage().getSOAPPart().getEnvelope(); SOAPBody body = envelope.getBody(); return body.getChildElements(); } catch (SOAPException e) { throw new IllegalStateException(e); } } @Override public boolean handleFault(SOAPMessageContext context) {return true;} @Override public void close(MessageContext context) {} @Override public Set<QName> getHeaders() {return null;} } 注册JAX-WS处理程序: 以声明 在服务接口旁边创建handlers.xml文件: <handler-chains xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee"> <handler-chain> <handler> <handler-name>StripHandlerr</handler-name> <handler-class>fully.qualified.StripHandler</handler-class> </handler> </handler-chain> </handler-chains> 并使用注释@HandlerChain(file =“handlers.xml”)将其附加到服务定义 编程 这是一种替代方法,不需要额外的xml文件. ((BindingProvider)service).getBinding().setHandlerChain(Arrays.<Handler>asList(new StripHandler()); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |