我正在处理使用RPC /编码的WSDL文件连接到我的Java / Spring服务的Web服务的问题。我无法改变这个WSDL。
我发现我必须使用Apache Axis 1.4来创建客户端(根据这个问题:https://dzone.com/articles/wsdltojava-error-rpcencoded)。
然后我遇到登录/密码/ api_key参数的问题:
<message name="login_message">
<part name="login" type="xsd:string"/>
<part name="password" type="xsd:string"/>
<part name="api_key" type="xsd:int"/>
</message>
错误Element 'api_key': '' is not a valid value of the atomic type 'xs:int'
我通过添加:
解决了这个问题webapi_locator.getEngine().setOption("sendMultiRefs", Boolean.FALSE);
现在我可以登录并从此服务获取一些数据,但我无法推送带有空参数的消息,如:
<message name="add_offer_input">
<part name="session" type="xsd:string"/>
<part name="category_id" type="xsd:int"/>
<part name="offer" type="tns:offer"/>
</message>
其中商品定义为:
<xsd:complexType name="offer">
<xsd:all>
<xsd:element name="price" type="xsd:float" minOccurs="0" maxOccurs="1"/>
<xsd:element name="price_m2" type="xsd:int" minOccurs="0" maxOccurs="1"/>
[...]
</xsd:all>
</xsd:complexType>
现在我得到像这样的例外:
org.apache.axis.AxisFault: Wrong parameters input xml
Element 'price': '' is not a valid value of the atomic type 'xs:int'. line: 1 column: 0'
at org.apache.axis.message.SOAPFaultBuilder.createFault(SOAPFaultBuilder.java:222) ~[axis-1.4.jar:na]
我已经尝试过设置
elemField.setNillable(false);
到
elemField.setNillable(true);
在Offer.java中。
我正在按以下方式创建Offer消息:
Offer offer = new Offer(null,null);
我将非常感谢找到此错误的解决方案。我不需要坚持使用轴1.4 - 任何其他允许我通过SOAP连接到此服务的解决方案对我来说都很有用。非常感谢您的帮助!
答案 0 :(得分:1)
您可能缺少WSDL中的nillable="true"
属性。
WSDL看起来应该类似于下面的内容:
..
<xsd:element name="price" type="xsd:float" nillable="true" minOccurs="0" maxOccurs="1"/>
..
nillable="true"
允许传递空参数。使用Axis 1.4的Java2WSDL没有这样做,因为writeWrappedParameter()
中的轴代码方法org/apache/axis/wsdl/fromJava/Types.java
没有它。