Groovy WsClient - типы карт не разрешаются должным образом - PullRequest
2 голосов
/ 11 февраля 2010

Я использую следующие строки кода для вызова веб-сервиса ниже:

 def wsdl = 'http://somewhere.com/services/msgService?wsdl'  
 proxy = new WSClient(wsdl, this.class.classLoader)  
 proxy.initialize()  

 def msg = proxy.create("com.somwhere.test.api.MsgService")
 msg.applicationName = "APP1"  
 msg.clientId = 5  
 msg.additionalProperties = [test:3]  

для веб-сервиса

  <xs:schema targetNamespace="http://somewhere.com/test/api/MsgService" version="1.0" xmlns:tns="http://somewhere.com/test/api/MsgService" xmlns:xs="http://www.w3.org/2001/XMLSchema">  
 <xs:element name="sendMessage" type="tns:sendMessage"/>  
   <xs:complexType name="sendMessage">  
    <xs:sequence>  
     <xs:element minOccurs="0" name="mRequest" type="tns:mServiceRequest"/>  
    </xs:sequence>  
   </xs:complexType>  
   <xs:complexType name="mServiceRequest">  
    <xs:sequence>  
     <xs:element name="additionalProperties">  
      <xs:complexType>  
       <xs:sequence>  
        <xs:element maxOccurs="unbounded" minOccurs="0" name="entry">  
         <xs:complexType>  
          <xs:sequence>  
           <xs:element minOccurs="0" name="key" type="xs:string"/>  
           <xs:element minOccurs="0" name="value" type="xs:anyType"/>  
          </xs:sequence>  
         </xs:complexType>  
        </xs:element>  
       </xs:sequence>  
      </xs:complexType>  
     </xs:element>  
     <xs:element minOccurs="0" name="applicationName" type="xs:string"/>  
     <xs:element minOccurs="0" name="clientId" type="xs:long"/>  
     .......  
    </xs:sequence>  
   </xs:complexType>  
  </xs:schema>  

Но получите следующую ошибку:

Caught: org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object '{test=3}' with class 'java.util.LinkedHashMap' to class 'com.somwhere.test.api.MsgService$AdditionalProperties'

Однако, когда дополнительные свойства представляют собой пустую карту, то есть [:] она работает нормально.

Что я делаю не так? Как мне отформатировать карту или какой другой объект мне нужно использовать, чтобы он работал?

Ответы [ 2 ]

1 голос
/ 07 февраля 2011

Это почти год ... Надеюсь, вы уже нашли ответ где-то еще.
Просто для записи я добавлю то, что думаю

Клиент должен был сгенерировать класс со свойствами key и value, просто создать его экземпляр с обычным create() и установить указанные свойства.
Поле additionalProperties может быть простым списком указанных «записей» или другим классом, обертывающим список, и в этом случае вам также необходимо создать () его.

Лучше всего проверить список сгенерированных классов при генерации клиента, создать каждый из них и выполнить дамп (), чтобы увидеть структуру.
Будьте готовы написать что-то вроде этого.

new groovyx.net.ws.WSClient(
    "http://localhost/service?wsdl",
    this.class.classLoader).with {
  initialize()

  def wrapper = create('defaultnamespace.MapWrapper')
  wrapper.map = create('defaultnamespace.ArrayOfMapWrapperEntry')
  wrapper.map.mapWrapperEntry = [key1:'value1',key2:'value2'].collect{k,v->
    def entry = create('defaultnamespace.MapWrapperEntry')
    entry.key = k
    entry.value = v
    entry
  }

  send wrapper    
}
0 голосов
/ 08 февраля 2011

Мы решили подключиться к другому шлюзу, который использует REST вместо wsdl, так как я не дал ему работать. Я не пробовал решение jpertinos, но оно выглядит многообещающим.

Однако я закрываю этот билет.

...