]
Jim Ma commented on JBWS-3964:
------------------------------
Holder parameter should not be annotated with the Mode.IN. CXF ignores this "IN"
property and always treat it as a out parameter, but we need to add some warning messing
for such holder parameter in CXF and let user know what's going on.
Incorrect behaviour with @WebParam(header = true, mode = IN)
------------------------------------------------------------
Key: JBWS-3964
URL:
https://issues.jboss.org/browse/JBWS-3964
Project: JBoss Web Services
Issue Type: Bug
Environment: Wildfly 9.0.2
Reporter: Xavier Dury
Assignee: Jim Ma
Given the following simple WebService with incoming and outgoing header @WebParams:
{code}
@Stateless
@WebService(name = "MyEchoService", targetNamespace = "urn:echo")
public class MyEchoService {
@WebResult(name = "result")
public String echo(
@WebParam(name = "message") String message,
@WebParam(name = "paramIn", mode = Mode.IN, header = true)
Holder<String> paramIn,
@WebParam(name = "paramOut", mode = Mode.OUT, header = true)
Holder<String> paramOut) {
paramOut.value = "got paramIn " + paramIn.value;
return "echo " + message;
}
}
{code}
The generated WSDL contains the following operation where the incoming @WebParam (mode =
IN) is present in both input and ouput:
{code}
<wsdl:operation name="echo">
<soap:operation soapAction="" style="document"/>
<wsdl:input name="echo">
<soap:header message="tns:echo" part="paramIn"
use="literal"></soap:header>
<soap:body parts="parameters" use="literal"/>
</wsdl:input>
<wsdl:output name="echoResponse">
<soap:header message="tns:echoResponse" part="paramIn"
use="literal"></soap:header>
<soap:header message="tns:echoResponse" part="paramOut"
use="literal"></soap:header>
<soap:body parts="result" use="literal"/>
</wsdl:output>
</wsdl:operation>
{code}
We can see in the following exchange that the incoming @WebParam will be copied verbatim
in the response:
{code}
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:urn="urn:echo">
<soapenv:Header>
<urn:paramIn>fred</urn:paramIn>
</soapenv:Header>
<soapenv:Body>
<urn:echo>
<urn:message>hello world!</urn:message>
</urn:echo>
</soapenv:Body>
</soapenv:Envelope>
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<paramIn xmlns="urn:echo">fred</paramIn>
<paramOut xmlns="urn:echo">got paramIn fred</paramOut>
</soap:Header>
<soap:Body>
<echoResponse xmlns="urn:echo">
<result>echo hello world!</result>
</echoResponse>
</soap:Body>
</soap:Envelope>
{code}
When the incoming header @WebParam is not set, an empty element will be added to the body
of the response:
{code}
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:urn="urn:echo">
<soapenv:Body>
<urn:echo>
<urn:message>hello world!</urn:message>
</urn:echo>
</soapenv:Body>
</soapenv:Envelope>
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<paramOut xmlns="urn:echo">got paramIn null</paramOut>
</soap:Header>
<soap:Body>
<echoResponse xmlns="urn:echo">
<result>echo hello world!</result>
</echoResponse>
<paramIn xsi:nil="true" xmlns="urn:echo"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
</soap:Body>
</soap:Envelope>
{code}