如何获取SOAP标头
这是请求
someId ...
我想得到那个userId
。
我试过这个
private List getHeaders() { MessageContext messageContext = context.getMessageContext(); if (messageContext == null || !(messageContext instanceof WrappedMessageContext)) { return null; } Message message = ((WrappedMessageContext) messageContext).getWrappedMessage(); return CastUtils.cast((List) message.get(Header.HEADER_LIST)); } private String getHeader(String name) { List headers = getHeaders(); if (headers != null) { for (Header header : headers) { logger.debug(header.getObject()); // return header by the given name } } return null; }
并记录[userId : null]
。 我怎样才能得到这个值,为什么在那里是null
?
“[userId:null]”通常是DOM元素的“toString”打印输出。 最有可能的是你做的事情
logger.debug(header.getObject().getClass())
你会看到它是somesort的DOM Element子类。 因此,像:
logger.debug(((Element)header.getObject()).getTextContent())
可能会打印文本节点。
import javax.xml.soap.*; SOAPPart part = request.getSOAPPart(); SOAPEnvelope env = part.getEnvelope(); SOAPHeader header = env.getHeader(); if (header == null) { // Throw an exception } NodeList userIdNode = header.getElementsByTagNameNS("*", "userId"); String userId = userIdNode.item(0).getChildNodes().item(0).getNodeValue();
您可以在没有拦截器且没有JAXB的情况下获取soap标头。
在service_impl类中添加:
public class YourFunctionNameImpl implements YourFunctionName{ @Resource private WebServiceContext context; private List getHeaders() { MessageContext messageContext = context.getMessageContext(); if (messageContext == null || !(messageContext instanceof WrappedMessageContext)) { return null; } Message message = ((WrappedMessageContext) messageContext).getWrappedMessage(); List headers = CastUtils.cast((List>) message.get(Header.HEADER_LIST)); return headers; }
…
然后在您的函数中,您可以使用:
List headers = getHeaders(); for(Iterator i = headers.iterator(); i.hasNext();) { Header h = i.next(); Element n = (Element)h.getObject(); System.out.println("header name="+n.getLocalName()); System.out.println("header content="+n.getTextContent()); }
拥有MessageContext
messageContext,您可以使用以下代码:
HeaderList hl = (HeaderList) messageContext.get(JAXWSProperties.INBOUND_HEADER_LIST_PROPERTY);
这使您可以访问所有SOAP标头。
我们可以通过在CXF拦截器中添加以下代码来获取服务器端的SOAP头。
创建一个类似的
公共类ServerCustomHeaderInterceptor扩展AbstractSoapInterceptor {
@Resource private WebServiceContext context; public ServerCustomHeaderInterceptor() { super(Phase.INVOKE); } @Override public void handleMessage(SoapMessage message) throws Fault,JAXBException { System.out.println("ServerCustomHeaderInterceptor handleMessage"); JAXBContext jc=null; Unmarshaller unmarshaller=null; try { jc = JAXBContext.newInstance("org.example.hello_ws"); unmarshaller = jc.createUnmarshaller(); } catch (JAXBException e) { e.printStackTrace(); } List list = message.getHeaders(); for (Header header : list) { ElementNSImpl el = (ElementNSImpl) header.getObject(); ParentNode pn= (ParentNode) el.getFirstChild(); //Node n1= (Node) pn; //Node n1= (Node) el.getFirstChild(); CustomHeader customHeader=(CustomHeader) unmarshaller.unmarshal(el.getFirstChild()); } }
在此之后我们需要将其作为拦截器注入
在您的服务器上下文xml中。
我们可能需要根据您的要求更改几行。 基本流程将像这样工作。