[ 
https://issues.apache.org/jira/browse/CXF-7761?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16529026#comment-16529026
 ] 

Glen Vermeylen commented on CXF-7761:
-------------------------------------

Apologies, it seems the site is public but the endpoint is restricted on ip.

Trying to set up a minimal testcase, but cant reproduce at home, so it must be 
tied to our specific cxf plugin configuration (not that it's so special). I'll 
try to provide something in the coming week.

> Soap Header contents getting mixed up
> -------------------------------------
>
>                 Key: CXF-7761
>                 URL: https://issues.apache.org/jira/browse/CXF-7761
>             Project: CXF
>          Issue Type: Bug
>          Components: JAX-WS Runtime
>    Affects Versions: 3.0.4, 3.2.4
>         Environment: Win7
> java 8 64bit
>  
>            Reporter: Glen Vermeylen
>            Priority: Major
>
> I'm trying to consume following web service which defines 2 Soap Headers
> fsbHeader (inout, fsbheadertype) and sentOnBehalfOf ( out, String):
> [https://fsb.services.int.belgium.be/PersonServices/GetExtendedPersonService/2.0/CPS_GetExtendedPersonService?WSDL]
> The generated Interface (-exsh = true) looks as follows:
> {code:java}
>     @WebMethod
>     @WebResult(name = "getExtendedPersonResponse", targetNamespace = 
> "http://fsb.belgium.be/getExtendedPersonService/messages/v2_00";, partName = 
> "body")
>     public GetExtendedPersonResponseType getExtendedPerson(
>         @WebParam(partName = "body", name = "getExtendedPersonRequest", 
> targetNamespace = 
> "http://fsb.belgium.be/getExtendedPersonService/messages/v2_00";)
>         GetExtendedPersonRequestType body,
>         @WebParam(partName = "header", name = "fsbHeader", targetNamespace = 
> "http://fsb.belgium.be/header";, header = true)
>         FsbHeaderType header,
>         @WebParam(partName = "header", name = "sentOnBehalfOf", 
> targetNamespace = "http://fsb.belgium.be/getExtendedPersonService/v2_00";, 
> header = true)
>         java.lang.String header1,
>         @WebParam(partName = "header", mode = WebParam.Mode.OUT, name = 
> "fsbHeader", targetNamespace = "http://fsb.belgium.be/header";, header = true)
>         javax.xml.ws.Holder<FsbHeaderType> header2
>     );{code}
> I call the server in following way (removing param contents as they are 
> irrelevant)
> {code:java}
>        FsbHeaderType requestHeader = new 
> FsbHeaderType().withMessageId(messageId);
>         String onBehalfOf = requester.getOnBehalfOfToken().orNull();
>         Holder<FsbHeaderType> headerHolder = new Holder<>(requestHeader);
>         return service.getExtendedPerson(request, requestHeader,"test", 
> headerHolder);{code}
> It appears that during marshalling of the SOAP payload, the value of 
> "sentOnBehalfOf" is being put in the part for "fsbHeader" and vice versa:
> {code:java}
> <snip, business code...>
>     at 
> org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.run(JUnit45AndHigherRunnerImpl.java:37)
>     at org.mockito.runners.MockitoJUnitRunner.run(MockitoJUnitRunner.java:62)
>     at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
>     at 
> com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
>     at 
> com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
>     at 
> com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
>     at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
> Caused by: java.lang.ClassCastException: 
> (org.company.package).getextendedpersonservice.v2.FsbHeaderType cannot be 
> cast to java.lang.String
>     at 
> com.sun.xml.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl$StringImplImpl.writeLeafElement(RuntimeBuiltinLeafInfoImpl.java:1034)
>     at 
> com.sun.xml.bind.v2.runtime.reflect.TransducedAccessor$CompositeTransducedAccessorImpl.writeLeafElement(TransducedAccessor.java:256)
>     at 
> com.sun.xml.bind.v2.runtime.property.SingleElementLeafProperty.serializeBody(SingleElementLeafProperty.java:130)
>     at 
> com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:161)
>     at 
> com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:131)
>     at 
> com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeBody(ElementBeanInfoImpl.java:333)
>     at 
> com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:340)
>     at 
> com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:76)
>     at 
> com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:494)
>     at 
> com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:323)
>     at 
> com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:178)
>     at 
> org.apache.cxf.jaxb.JAXBEncoderDecoder.writeObject(JAXBEncoderDecoder.java:614)
>     at 
> org.apache.cxf.jaxb.JAXBEncoderDecoder.marshall(JAXBEncoderDecoder.java:243)
>     at org.apache.cxf.jaxb.io.DataWriterImpl.write(DataWriterImpl.java:239)
>     at 
> org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.handleHeaderPart(SoapOutInterceptor.java:259)
>     at 
> org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.writeSoapEnvelopeStart(SoapOutInterceptor.java:182)
>     at 
> org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.handleMessage(SoapOutInterceptor.java:88)
>     at 
> org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.handleMessage(SoapOutInterceptor.java:68)
>     at 
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
>     at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:533)
>     at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:442)
>     at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:343)
>     at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:296)
>     at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
>     at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:139)
>     ... 32 common frames omitted{code}
> Debugging SoapOutInterceptor:259 (dataWriter.write(arg, header.getPart(), 
> xtw); – at end of loop), I see this line gets hit twice:
> {code:java}
> 1)
> part = {MessagePartInfo@3936} "[MessagePartInfo 
> name={http://fsb.belgium.be/getExtendedPersonService/v2_00}header, 
> ConcreteName={http://fsb.belgium.be/header}fsbHeader";
> arg = "test"
> (weirdly enough this does not fail during marshalling)
> 2)
> part = {MessagePartInfo@3998} "[MessagePartInfo 
> name={http://fsb.belgium.be/getExtendedPersonService/v2_00}header, 
> ConcreteName={http://fsb.belgium.be/getExtendedPersonService/v2_00}sentOnBehalfOf";
> arg = {FsbHeaderType@3999} {code}
> ==> when the 2nd part gets marshalled it results in above stacktrace
> I no longer have the debug info, but I saw that the root cause was inside 
> org.apache.cxf.service.model.MessagePartInfo#getIndex, where the incorrect 
> index was reported to obtain the header value. I tried to debug the 
> initialization of the service to figure out how those indexes are set, but I 
> got a bit lost there :)
> Originally I used cxf 3.0.4, which resulted in an xml parsing error by the 
> Soap webservice. In our logging I saw that the value of the sentOnBehalfOf 
> was put in an fsbHeader element:
> {code:java}
> <ns22:fsbHeader xmlns:xs="http://www.w3.org/2001/XMLSchema"; 
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
> xmlns:ns23="http://fsb.belgium.be/getExtendedPersonService/v2_00"; 
> xmlns:ns22="http://fsb.belgium.be/header"; 
> xmlns:ns21="http://fsb.belgium.be/data/entity/address/diplomaticplace/v1_00"; 
> xmlns:ns20="http://fsb.belgium.be/data/common/label/v1_00"; 
> xmlns:ns19="http://fsb.belgium.be/data/entity/address/v1_00"; 
> xmlns:ns18="http://fsb.belgium.be/data/business/address/v1_00"; 
> xmlns:ns17="http://fsb.belgium.be/data/entity/person/contactinfo/v1_00"; 
> xmlns:ns16="http://fsb.belgium.be/data/entity/person/sharedhosting/v1_00"; 
> xmlns:ns15="http://fsb.belgium.be/data/entity/person/nationality/v1_00"; 
> xmlns:ns14="http://fsb.belgium.be/data/entity/person/profession/v1_00"; 
> xmlns:ns13="http://fsb.belgium.be/data/entity/person/legaldisability/v1_00"; 
> xmlns:ns12="http://fsb.belgium.be/data/entity/person/legalcohabitation/v1_00"; 
> xmlns:ns11="http://fsb.belgium.be/data/entity/person/civilstate/v2_00"; 
> xmlns:ns10="http://fsb.belgium.be/data/entity/person/decease/v1_00"; 
> xmlns:ns9="http://fsb.belgium.be/data/common/date/v2_00"; 
> xmlns:ns8="http://fsb.belgium.be/data/entity/person/birth/v1_00"; 
> xmlns:ns7="http://fsb.belgium.be/data/entity/person/name/v1_00"; 
> xmlns:ns6="http://fsb.belgium.be/data/entity/person/v2_00"; 
> xmlns:ns5="http://fsb.belgium.be/data/common/error/v1_00"; 
> xmlns:ns4="http://fsb.belgium.be/data/common/code/v1_00"; 
> xmlns:ns3="http://fsb.belgium.be/data/business/person/v2_00"; 
> xmlns:ns2="http://fsb.belgium.be/getExtendedPersonService/messages/v2_00"; 
> xmlns="http://fsb.belgium.be/data/business/context/v1_00"; 
> xsi:type="xs:string">test</ns22:fsbHeader>{code}
> there was no "sentOnBehalfOf" tag present containing the fsbHeader content...
> I aligned all cxf dependencies (library and cxf-codegen plugin) to latest 
> version 3.2.4, which resulted in above stack trace (due to added xml 
> validation I assume).
> Commenting the "sentOnBehalfOf" element in the wsdl getExtendedPerson>input 
> element results in fsbHeader becoming an INOUT parameter:
> {code:java}
>     @WebMethod
>     @WebResult(name = "getExtendedPersonResponse", targetNamespace = 
> "http://fsb.belgium.be/getExtendedPersonService/messages/v2_00";, partName = 
> "body")
>     public GetExtendedPersonResponseType getExtendedPerson(
>         @WebParam(partName = "body", name = "getExtendedPersonRequest", 
> targetNamespace = 
> "http://fsb.belgium.be/getExtendedPersonService/messages/v2_00";)
>         GetExtendedPersonRequestType body,
>         @WebParam(partName = "header", mode = WebParam.Mode.INOUT, name = 
> "fsbHeader", targetNamespace = "http://fsb.belgium.be/header";, header = true)
>         javax.xml.ws.Holder<FsbHeaderType> header
>     );{code}
> ==> this results in a working call
> Leaving the wsdl as-is and editing the generated code to below also results 
> in a working call, but the "sentOnBehalfOf" header is not filled in:
> {code:java}
>     @WebMethod
>     @WebResult(name = "getExtendedPersonResponse", targetNamespace = 
> "http://fsb.belgium.be/getExtendedPersonService/messages/v2_00";, partName = 
> "body")
>     public GetExtendedPersonResponseType getExtendedPerson(
>         @WebParam(partName = "body", name = "getExtendedPersonRequest", 
> targetNamespace = 
> "http://fsb.belgium.be/getExtendedPersonService/messages/v2_00";)
>         GetExtendedPersonRequestType body,
>         @WebParam(partName = "header", name = "sentOnBehalfOf", 
> targetNamespace = "http://fsb.belgium.be/getExtendedPersonService/v2_00";, 
> header = true)
>         java.lang.String header1,
>         @WebParam(partName = "header", mode = WebParam.Mode.INOUT, name = 
> "fsbHeader", targetNamespace = "http://fsb.belgium.be/header";, header = true)
>         javax.xml.ws.Holder<FsbHeaderType> header2
>     );{code}
> I can provide more info if needed (cxf-codegen plugin config, instantiation 
> of the service, but that's all pretty standard)



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to