2013-06-06 2 views
2

Я автоматически создавал решение из файла WSDL для проекта, над которым я работаю, но по какой-то причине решение, похоже, неправильно обрабатывает входные данные, определенные WSDL. Кто-нибудь знает, что я могу сделать, чтобы исправить это?Недопустимый элемент в запросе SOAP

Учитывая следующие операции:

<wsdl:operation name="createBin"> 
    <wsdl:input message="impl:createBinRequest" name="createBinRequest"/> 
    <wsdl:output message="impl:createBinResponse" name="createBinResponse"/> 
</wsdl:operation> 
<wsdl:message name="createBinRequest"> 
    <wsdl:part element="impl:createBin" name="parameters"/> 
</wsdl:message> 
<element name="createBin"> 
    <complexType> 
     <sequence> 
      <element name="request" type="impl:Bin"/> 
     </sequence> 
    </complexType> 
</element> 
<complexType name="Bin"> 
    <sequence> 
     <element name="FulfillerID" type="xsd:positiveInteger"/> 
     <element name="BinID" nillable="true" type="xsd:positiveInteger"/> 
     <element name="ExternalLocationID" type="xsd:string"/> 
     <element name="BinType" type="xsd:string"/> 
     <element name="BinStatus" type="xsd:string"/> 
     <element name="Name" nillable="true" type="xsd:string"/> 
    </sequence> 
</complexType> 

Реализовано с этим кодом (автоматически генерируется затмении):

public PositiveInteger createBin(Bin request) throws RemoteException { 
    throw new UnsupportedOperationException(); 
} 

При отправке этого сообщения:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="http://my.api.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soapenv:Body> 
     <q0:createBin> 
      <q0:request> 
       <q0:FulfillerID>1234</q0:FulfillerID> 
       <q0:BinID>1234</q0:BinID> 
       <q0:ExternalLocationID>1234</q0:ExternalLocationID> 
       <q0:BinType>Good</q0:BinType> 
       <q0:BinStatus>Bad</q0:BinStatus> 
       <q0:Name>Ugly</q0:Name> 
      </q0:request> 
     </q0:createBin> 
    </soapenv:Body> 
</soapenv:Envelope> 

Я получаю следующая погрешность:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soapenv:Body> 
     <soapenv:Fault> 
      <faultcode>soapenv:Server.userException</faultcode> 
      <faultstring>org.xml.sax.SAXException: Invalid element in com.api.my.Bin - request</faultstring> 
      <detail> 
       <ns1:hostname xmlns:ns1="http://xml.apache.org/axis/">localhost</ns1:hostname> 
      </detail> 
     </soapenv:Fault> 
    </soapenv:Body> 
</soapenv:Envelope> 

Я на 100% уверен, что SOAP-сообщение является правильным, поэтому мой сервер должен что-то задыхаться. Когда я удаляю параметр, все работает плавно по какой-то причине.

Я могу однако, получить ожидаемое поведение путем удаления элемента, как так:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="http://my.api.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soapenv:Body> 
     <q0:createBin> 
      <q0:FulfillerID>1234</q0:FulfillerID> 
      <q0:BinID>1234</q0:BinID> 
      <q0:ExternalLocationID>1234</q0:ExternalLocationID> 
      <q0:BinType>Good</q0:BinType> 
      <q0:BinStatus>Bad</q0:BinStatus> 
      <q0:Name>Ugly</q0:Name> 
     </q0:createBin> 
    </soapenv:Body> 
</soapenv:Envelope> 
+0

Наличие метода 'createBin', генерирующего неопределенное исключение, например' UnsupportedOperationException', может привести к «неуказанной» ошибке мыла. Что вы ожидаете? – home

+0

Назовите меня сумасшедшим, но я ожидал 'UnsupportedOperationException', а не' SAXException'. –

ответ

0

Оказалось, что анализатор SAX не интерпретирует запрос, который, как он выглядит, должен. Несмотря на то, что параметр для метода равен request, он игнорирует это и ожидает разбора элемента, который имеет поле request типа com.api.my.Bin. Проблема была исправлена ​​путем изменения.

public PositiveInteger createBin(Bin request) throws RemoteException { 
    throw new UnsupportedOperationException(); 
} 

С

public PositiveInteger createBin(CreateBin request) throws RemoteException { 
    throw new UnsupportedOperationException(); 
} 

Где

public class CreateBin { 
    public Bin request; 

    /* ... */ 
} 

Хотя, быть прозрачным, я должен сделать много донастроить к CoreServiceSoapBindingStub и CoreServiceSoapBindingSkeleton, что затмение сгенерированного для того, чтобы получить все это не взорвать из-за недействительного чего-то другого.

1

Я ищу мой мозг, чтобы вспомнить, где я видел это раньше, но я уверен, что я видел некоторые казалось бы, «недопустимые запросы SOAP», которые оказались недопустимыми, поскольку ответ был недействительным.

В этом свете: можете ли вы изменить сгенерированный код createBin (Bin request), чтобы вернуть PositiveInteger, а не -3? Возможно, если мы сможем сделать ответ на ваш вопрос действительным, ваш сервер перестанет жаловаться.

Удачи!

+0

Спасибо за вашу помощь. Я добавил несколько подробностей к вопросу, но я забыл упомянуть, что отправил «искаженный» запрос и получил ответ со значением -3 (как это ни странно). –

Смежные вопросы