Hi,Freeman: I have found out another problem......... If the header and the body have different namespace,the body's namespace was lost!
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">< soap:Header><wsse:AuthResult xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/ oasis-200401-wss-wssecurity-secext-1.0.xsd" mustUnderstand="true"><wsse:ResultCo de>0000</wsse:ResultCode><wsse:ResultDetail>认证成功!</wsse:ResultDetail></wsse: AuthResult></soap:Header><soap:Body><findSubscriptionNotifierResult><success>tru e</success><message>ESB09000</message><subscriptionNotifiers /></findSubscriptio nNotifierResult></soap:Body></soap:Envelope> Freeman Fang wrote: > > Hi, > > I just verified this is a bug, create SMXCOMP-632[1] to track it, the > fix is coming soon. > The work around currently for you is add an interceptor as follows > > public class ExtractHeaderPartIntercepor extends > AbstractPhaseInterceptor<Message> { > > public ExtractHeaderPartIntercepor() { > super(Phase.PRE_STREAM); > } > > public void handleMessage(Message message) { > > extractHeaderFromMessagePart(message); > } > > private void extractHeaderFromMessagePart(Message message) { > Source source = message.getContent(Source.class); > if (source == null) { > return; > } > > Element element; > try { > element = new SourceTransformer().toDOMElement(source); > } catch (Exception e) { > throw new Fault(e); > } > > if (!JbiConstants.WSDL11_WRAPPER_NAMESPACE.equals(element > .getNamespaceURI()) > || !JbiConstants.WSDL11_WRAPPER_MESSAGE_LOCALNAME > .equals(element.getLocalName())) { > message.setContent(Source.class, new DOMSource(element)); > return; > } > > BindingOperationInfo bop = message.getExchange().get( > BindingOperationInfo.class); > if (bop == null) { > throw new Fault( > new Exception("Operation not bound on this > message")); > } > BindingMessageInfo msg = isRequestor(message) ? > bop.getInput() : bop > .getOutput(); > > SoapBindingInfo binding = (SoapBindingInfo) > message.getExchange().get( > Endpoint.class).getEndpointInfo().getBinding(); > String style = binding.getStyle(bop.getOperationInfo()); > if (style == null) { > style = binding.getStyle(); > } > > Element partWrapper = DomUtil.getFirstChildElement(element); > while (partWrapper != null) { > extractHeaderParts((SoapMessage) message, element, > partWrapper, msg); > partWrapper = DomUtil.getNextSiblingElement(partWrapper); > } > message.setContent(Source.class, new DOMSource(element)); > } > > private void extractHeaderParts(SoapMessage message, > Element element, Element partWrapper, BindingMessageInfo > msg) { > List<NodeList> partsContent = new ArrayList<NodeList>(); > if (partWrapper != null) { > if (!JbiConstants.WSDL11_WRAPPER_NAMESPACE.equals(element > .getNamespaceURI()) > || !JbiConstants.WSDL11_WRAPPER_PART_LOCALNAME > .equals(partWrapper.getLocalName())) { > throw new Fault(new Exception( > "Unexpected part wrapper element '" > + QNameUtil.toString(element) + "' > expected '{" > + JbiConstants.WSDL11_WRAPPER_NAMESPACE > + "}part'")); > } > NodeList nodes = partWrapper.getChildNodes(); > partsContent.add(nodes); > } > > List<Header> headerList = message.getHeaders(); > List<SoapHeaderInfo> headers = > msg.getExtensors(SoapHeaderInfo.class); > for (SoapHeaderInfo header : headers) { > if (partsContent.size() == 0) { > break; > } > > NodeList nl = partsContent.get(0); > if > (header.getPart().getConcreteName().getNamespaceURI().equals( > nl.item(0).getNamespaceURI()) > && > header.getPart().getConcreteName().getLocalPart() > .equals(nl.item(0).getLocalName())) { > headerList.add(new > Header(header.getPart().getConcreteName(), > nl.item(0))); > partsContent.remove(0); > } > > } > > } > > } > > Then add ExtractHeaderPartIntercepor to your cxf bc consumer > <cxfbc:outInterceptors> > > [1]https://issues.apache.org/activemq/browse/SMXCOMP-632 > > Freeman > On 2009-9-7, at 下午9:47, inter wrote: > >> >> Hi,Freeman : >> I wrote a cxf-interceptor just before JbiOutWsdl1Interceptor at >> Phase.MARSHAL to trace the flow. >> I found that the JbiOutWsdl1Interceptor has parsed the jbi- >> message as >> expected. >> It got out the soap-headers and put it into the headlist,like : >> List<Header> headerList = message.getHeaders(); >> headerList.add(new Header(header.getPart().getConcreteName(), >> nl.item(0))); >> >> >> I print out the header's name ,it was "AuthResult" and namespace was >> also >> the expected. >> >> But the SoapResponse to the client still has only the soap body. >> >> How can i go ahead? >> >> Is it the problem of SoapOutInterceptor$SoapOutEndingInterceptor,or >> StaxOutInterceptor$StaxOutEndingInterceptor,or >> MessageSenderInterceptor$MessageSenderEndingInterceptor? >> >> This really confused me. >> >> Expecting for your help! >> >> >> >> >> >> Freeman Fang wrote: >>> >>> >>> It should work, ensure the jbi part you added has same namespace and >>> local name as it defined in the schema. >>> what's the servicemix version you are using? >>> >>> Freeman >>>> Freeman Fang wrote: >>>>> >>>>> Hi, >>>>> Cxf bc provider parse JBI message and generate soap message based >>>>> on >>>>> wsdl model. >>>>> So if the wsdl used for your cxf bc provider has no soap header in >>>>> binding def, the soap message sent out from your cxf bc provider >>>>> won't >>>>> have soap header, it's expected behavior. >>>>> You may need change your provider wsdl first. >>>>> >>>>> Freeman >>>>> On 2009-9-6, at 上午11:58, inter wrote: >>>>> >>>>>> >>>>>> I used cxf-bc-consumer,cxf-bc-provider and camel like follows: >>>>>> >>>>>> cxf-bc-consumer=(1)=>servicemix-camel=(2)=>cxf-bc- >>>>>> provider=(3)=>external >>>>>> server=(4)=>back to==>cxf- >>>>>> -bc-provider=(5)=>servicemix-camel=(6)=>cxf-bc-consumer. >>>>>> >>>>>> The consumer and provider both have their own wsdl file. >>>>>> The only difference of the two wsdl-files is that:the consumer's >>>>>> wsdl has a >>>>>> out-soap-header in binding def >>>>>> >>>>>> but the provider's does not have it. >>>>>> >>>>>> So in step(6),i add a camel-processor to add a soap-heaer part in >>>>>> JBI msg >>>>>> ,the whole msg after my processor like this: >>>>>> ------------------------------------------------------------------------------------- >>>>>> <?xml version="1.0" encoding="UTF-8"?> >>>>>> <jbi:message xmlns:jbi="http://java.sun.com/xml/ns/jbi/wsdl-11- >>>>>> wrapper" >>>>>> xmlns:msg="http://server" xmlns:xsd="http://www.w3.org/2001/ >>>>>> XMLSchema" >>>>>> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >>>>>> name="sayHelloResponse" type="msg:sayHelloResponse" >>>>>> version="1.0"> >>>>>> <jbi:part> >>>>>> <ns1:sayHelloResponse xmlns:ns1="http://server"> >>>>>> <ns1:out>Hello!!!boy</ns1:out> >>>>>> </ns1:sayHelloResponse> >>>>>> </jbi:part> >>>>>> <jbi:part> >>>>>> <wsse:AuthResult >>>>>> >>>>>> xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd >>>>>> " >>>>>> mustUnderstand="true"> >>>>>> <wsse:ResultCode>0000</wsse:ResultCode> >>>>>> <wsse:ResultDetail>success</wsse:ResultDetail> >>>>>> </wsse:AuthResult> >>>>>> </jbi:part> >>>>>> </jbi:message> >>>>>> ------------------------------------------------------------------------------------------------ >>>>>> >>>>>> But when out of servicemix-cxf-bc,the soap message does not >>>>>> contain >>>>>> soap-header at all,it just contains >>>>>> the body message. >>>>>> I am sure that I have added a soap-header to the binding def of >>>>>> the >>>>>> consumer's wsdl. >>>>>> >>>>>> I upload my whole sa ZIP , in the cxf-bc-su.zip,there are all the >>>>>> wsdl >>>>>> files. >>>>>> The proxy.wsdl is the consumer's,and the service.wsdl is the >>>>>> provider's,the >>>>>> wsse.xsd is the imported schema in which the soap header is >>>>>> defined. >>>>>> >>>>>> http://www.nabble.com/file/p25314469/test.zip test.zip >>>>>> >>>>>> -- >>>>>> View this message in context: >>>>>> http://www.nabble.com/Problems-with-adding-out-soap-header-for-cxf-bc..-tp25314469p25314469.html >>>>>> Sent from the ServiceMix - User mailing list archive at >>>>>> Nabble.com. >>>>>> >>>>> >>>>> >>>>> -- >>>>> Freeman Fang >>>>> ------------------------ >>>>> Open Source SOA: http://fusesource.com >>>>> >>>>> >>>>> >>>> >>>> -- >>>> View this message in context: >>>> http://www.nabble.com/Problems-with-adding-out-soap-header-for-cxf-bc..-tp25314469p25316117.html >>>> Sent from the ServiceMix - User mailing list archive at Nabble.com. >>>> >>> >>> >>> -- >>> Freeman Fang >>> ------------------------ >>> Open Source SOA: http://fusesource.com >>> >>> >>> >> >> -- >> View this message in context: >> http://www.nabble.com/Problems-with-adding-out-soap-header-for-cxf-bc..-tp25314469p25330829.html >> Sent from the ServiceMix - User mailing list archive at Nabble.com. >> > > > -- > Freeman Fang > ------------------------ > Open Source SOA: http://fusesource.com > > > -- View this message in context: http://www.nabble.com/Problems-with-adding-out-soap-header-for-cxf-bc..-tp25314469p25377111.html Sent from the ServiceMix - User mailing list archive at Nabble.com.
