问题
I have a SOAP web service code as below:
public void sumAndMultiplyAndReference
(@WebParam(name = "firstnumber")int a,
@WebParam(name = "firstnumber")int b,
@WebParam(name = "referencenumber")int c
@WebParam(name = "sum", mode = WebParam.Mode.OUT) Holder<Integer> sum,
@WebParam(name = "multiply", mode = WebParam.Mode.OUT) Holder<Integer> multiply,
@WebParam(name = "reference", mode = WebParam.Mode.OUT) Holder<Integer> reference){
sum.value = a + b;
multiply.value = a * b;
reference.value = c;
}
It is working fine. But what should be changed in the code such that, the request parameter name = referencenumber and reply parameter name be same?
Note: here- request parameter name = referencenumber
response parameter name = reference
回答1:
This works for me:
package org.toto.bla;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.xml.ws.Holder;
@WebService
public class WSTest {
@WebMethod
public void sumAndMultiplyAndReference(@WebParam(name = "firstnumber") int a, @WebParam(name = "secondnumber") int b,
@WebParam(name = "referencenumber") int c,
@WebParam(name = "sum", mode = WebParam.Mode.OUT) Holder<Integer> sum,
@WebParam(name = "multiply", mode = WebParam.Mode.OUT) Holder<Integer> multiply,
@WebParam(name = "referencenumber", mode = WebParam.Mode.OUT) Holder<Integer> reference) {
sum.value = a + b;
multiply.value = a * b;
reference.value = c;
}
}
And here is the generated XSD from this:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:ns0="http://bla.toto.org/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://exporter.vas.asgs.atos.net/">
<xsd:complexType name="sumAndMultiplyAndReferenceResponse">
<xsd:sequence>
<xsd:element name="sum" type="xsd:int" minOccurs="0"/>
<xsd:element name="multiply" type="xsd:int" minOccurs="0"/>
<xsd:element name="referencenumber" type="xsd:int" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="sumAndMultiplyAndReference">
<xsd:sequence>
<xsd:element name="firstnumber" type="xsd:int"/>
<xsd:element name="secondnumber" type="xsd:int"/>
<xsd:element name="referencenumber" type="xsd:int"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="sumAndMultiplyAndReferenceResponse" type="ns0:sumAndMultiplyAndReferenceResponse"/>
<xsd:element name="sumAndMultiplyAndReference" type="ns0:sumAndMultiplyAndReference"/>
</xsd:schema>
You could also use the INOUT
param type:
package org.toto.bla;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.xml.ws.Holder;
@WebService
public class WSTest {
@WebMethod
public void sumAndMultiplyAndReference(@WebParam(name = "firstnumber") int a, @WebParam(name = "secondnumber") int b,
@WebParam(name = "sum", mode = WebParam.Mode.OUT) Holder<Integer> sum,
@WebParam(name = "multiply", mode = WebParam.Mode.OUT) Holder<Integer> multiply,
@WebParam(name = "referencenumber", mode = WebParam.Mode.INOUT) Holder<Integer> c) {
sum.value = a + b;
multiply.value = a * b;
}
}
Which generates the exact same XSD.
回答2:
Use WebParam.Mode.INOUT
, that way you will be able to use it in bi-directional way.
Read from Apache about @WebParam, below is excerpt.
If the Holders were specified as WebParam.Mode.INOUT params, then the client could use them to send data and the application as well. The Holder instances would then be initialized with the data from the client request. The application could check the data before eventually overriting it with the response values.
来源:https://stackoverflow.com/questions/32904132/how-to-receive-and-send-with-same-parameter-name-in-java-soap