Java, RPC/ закодированный клиент Axis 1.4 не может отправить нулевой аргумент
Я имею дело с проблемой подключения к веб-сервису с RPC/ закодированным файлом WSDL к моему сервису Java/Spring. Я не могу изменить этот 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 offer = new Offer(null,null);
Я буду очень благодарен за найденное решение для этой ошибки. Мне не нужно придерживаться оси 1.4 - любое другое решение, которое позволяет мне подключаться к этому сервису через SOAP, будет для меня полезным. Большое спасибо за помощь!
1 ответ
Вы, вероятно, скучаете по nillable="true"
атрибут в вашем WSDL.
WSDL должен выглядеть примерно так:
..
<xsd:element name="price" type="xsd:float" nillable="true" minOccurs="0" maxOccurs="1"/>
..
nillable="true"
позволяет передавать нулевые аргументы. Java2WSDL с использованием Axis 1.4 не делает этого, как метод кода оси writeWrappedParameter()
в org/apache/axis/wsdl/fromJava/Types.java
не имеет его
Больше информации об ошибке: https://issues.apache.org/jira/browse/AXIS-243