Я имею сталкивающийся с проблемой отправления сложных запросов с GroovyWS.
Это - демонстрационный запрос, сгенерированный soapUI:
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:dex="http://www.temp.com/com/dex"
>
<soapenv:Header/>
<soapenv:Body>
<dex:executeRequest>
<!--Optional:-->
<a>?</a>
<!--Optional:-->
<b>?</b>
<!--Optional:-->
<parameters>
<!--Zero or more repetitions:-->
<parameter>
<!--Optional:-->
<key>?</key>
<!--Optional:-->
<value>?</value>
</parameter>
</parameters>
<!--Optional:-->
<c>?</c>
<!--Optional:-->
<d>?</d>
</dex:feedrequest>
</soapenv:Body>
</soapenv:Envelope>
часть отличного кода:
def proxy = webService.getClient(grailsApplication.config.ws.endpoint);
proxy.processdRequest(?);
Таким образом, что я должен передать вместо?.
Спасибо за Вас справка.
- vova.
Большое спасибо, Билл.
Я просто хочу добавить информацию для будущих читателей.
Чтобы включить ведение журнала для GroovyWS в Grails:
log4j = {
debug 'grails.app',
'groovyx.net.ws',
'org.apache.cxf'
}
С помощью этого, как уже упоминалось, Билл, вы можете видеть имена классов.
Еще одно: параметры
могут иметь другой тип. Не Список >
. Поэтому его тоже нужно создавать.
def params = proxy.create('com.temp.feeds.FeedRequestType$Parameters');
Чтобы получить доступные методы и поля для вновь созданных объектов, вы можете использовать отражение Groovy:
params.class.methods.each{
println it;
}
params.class.fields.each{
println it;
}
Вот и все!
-vova
GroovyWS динамически создает классы для каждого из типов аргументов, необходимых для передачи данных в вызов веб-сервиса. Например, если вызов веб-сервиса был:
public int passSomeArgs( Arg1Type a, Arg2Type b );
GroovyWS динамически создаст класс Arg1Type и класс Arg2Type, к которым вы сможете обратиться через метод прокси-сервера.
// this will instantiate an Arg1Type for you
def arg1 = proxy.create( "ns1.ns2.Arg1Type" );
// this will instantiate an Arg2Type for you
def arg2 = proxy.create( "ns1.ns2.Arg2Type" );
Затем вы можете заполнить экземпляр arg1/arg2 данными и сделать свой вызов:
int ret = proxy.passSomeArgs( arg1, arg2 );
Обратите внимание, что в создаваемых классах, вероятно, задействованы некоторые пространства имен. Я использовал журнал CXF, который печатался, когда GroovyWS обрабатывал WSDL, чтобы увидеть, какими, по мнению CXF, должны быть имена классов.