[ https://issues.apache.org/jira/browse/CXF-7761?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Glen Vermeylen updated CXF-7761: -------------------------------- Description: 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 this gets marshalled it results in above stacktrace 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 error (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) was: 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 (line [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 this gets marshalled it results in above stacktrace 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 error (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) > 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 this gets marshalled it results in above stacktrace > 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 error (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)