ЗАПИСИ

spring ws logo Grails WebServices plugin   Grails WS %d1%82%d0%b5%d1%85%d0%bd%d0%be%d0%bb%d0%be%d0%b3%d0%b8%d0%b8

Hola.

Мучачос!

Вобщем так. Потратив пол ночи на то, чтобы понять как же завести Contract First WebServices in Grails с multiple operations on one endpoint (несколько вебсервис методов на одном порту/ендпоинте), я решил, что кто то может испытать такое же разочарование, поэтому пускай лучше прочитают этот пост, как же завести это гавнецо, а если чо — спрашивают.

Перепробовали мы много грейл плагинов, среди них:

  • XFire
  • CXF
  • Metro-Grails
  • Spring-WS

Первые 3 как то ваобще тяжко настроить за Contract First реализацию, CXF как то там проде попроще, но и то до конца не понятно.

Но самый новый (по дате апдейта) из плагинов Spring-WS все таки удалось настроить, и даже получить правильную сгенерированную WSDL‘ку.

Почитайте SpringwsGrailsPlugin.groovy — многое поймете icon smile Grails WebServices plugin   Grails WS %d1%82%d0%b5%d1%85%d0%bd%d0%be%d0%bb%d0%be%d0%b3%d0%b8%d0%b8

Первый шаг

Вытащить из вашей WSDL‘ки XSD (типы) и создать файло типа /web-app/WEB-INF/MySchema.xsd

Второй щаг

Создать ендпоинт классы, а точнее классы обработчики конкретной операции на ендпоинте.

  1. $ grails create-endpoint com.mycompany.Op1
  2.  
  3. $ grails create-endpoint com.mycompany.Op2
  4.  
  5. $ grails create-endpoint com.mycompany.Op3

Третий шаг

Настроить /grails-app/conf/Config.groovy примерно так:

springws {
  1.  wsdl {
  2.   MyOp1 {
  3.    wsdlName= 'UniqWSOps'
  4.    xsds= '/WEB-INF/MySchema.xsd'
  5.    portTypeName = 'MyUniqPort'
  6.    serviceName = 'MyUniqService'
  7.    locationUri = grails.serverURL + '/services/UniqWS'
  8.    targetNamespace = 'http://namespaces.mycomp.com/uniqws/wsdl'
  9.   }
  10.   MyOp2 {
  11.    wsdlName= 'UniqWSOps'
  12.    xsds= '/WEB-INF/MySchema.xsd'
  13.    portTypeName = 'MyUniqPort'
  14.    serviceName = 'MyUniqService'
  15.    locationUri = grails.serverURL + '/services/UniqWS'
  16.    targetNamespace = 'http://namespaces.mycomp.com/uniqws/wsdl'
  17.   }
  18.   MyOp2 {
  19.    wsdlName= 'UniqWSOps'
  20.    xsds= '/WEB-INF/MySchema.xsd'
  21.    portTypeName = 'MyUniqPort'
  22.    serviceName = 'MyUniqService'
  23.    locationUri = grails.serverURL + '/services/UniqWS'
  24.    targetNamespace = 'http://namespaces.mycomp.com/uniqws/wsdl'
  25.   }
  26.  }
  27. }

т.е. они вссе одинаковые! только название операций разнится.

Четвертый шаг

Согласно конфигу из шага 4 WSDL должна выглядеть примерно так:

<wsdl:definitions name=»UniqWSOps» targetNamespace=»http://namespaces.mycomp.com/uniqws/wsdl»
  1. &lt;!— …
  2. … —&gt;
  3.    &lt;wsdl:portType name="MyUniqPort"&gt;
  4.       &lt;wsdl:operation name="Op1"&gt;
  5.          &lt;wsdl:input message="myns:Op1_Input"/&gt;
  6.          &lt;wsdl:output message="myns:Op1_Output"/&gt;
  7.       &lt;/wsdl:operation&gt;
  8.       &lt;wsdl:operation name="Op2"&gt;
  9.          &lt;wsdl:input message="myns:Op2_Input"/&gt;
  10.          &lt;wsdl:output message="myns:Op2_Output"/&gt;
  11.       &lt;/wsdl:operation&gt;
  12.      &lt;!— …. —&gt;
  13.    &lt;/wsdl:portType&gt;
  14. &lt;!— …
  15. … —&gt;
  16.    &lt;wsdl:service name="MyUniqService"&gt;
  17.       &lt;wsdl:port name="MyUniqPort" binding="myns:MyUniqBinding"&gt;
  18.          &lt;soap:address location="http://localhost:8050/myws-grails/services/UniqWS"/&gt;
  19.       &lt;/wsdl:port&gt;
  20.    &lt;/wsdl:service&gt;
  21.  
  22.  &lt;/wsdl:definitions&gt;

т.е. у нас на ендпоинте висит несколько операций!

Пятый шаг

Хренька работает!

$ grails -Dserver.port=8050 run-app

Сгенерированная грейлсом по XSD’шке WSDL’ка доступна по адресу http://localhost:8050/myws-grails/services/UniqWS/UniqWSOps.wsdl

Удачки!

Grails SpringWS plugin

Spring-WS

#1 Июнь 1, 2014 в 01:06
александр

прежде чем учить сервисы и говорить, что что-то там плохо работает…
поучил бы русский язык

#2 Июнь 13, 2014 в 15:56

какой умный и нервный Саша :)