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

Другие вопросы по тегам