Поиск по этому блогу

вторник, 29 июля 2014 г.

Генерация клиента web-сервиса с использованием maven и Apache CXF


  1.  В pom.xml  добавляем apache cxf в качестве зависимости:
    
    
        <properties>
            <endorsed .dir="">${project.build.directory}/endorsed</endorsed>
            <project .build.sourceencoding="">UTF-8</project>
            <cxf .version="">3.0.1</cxf>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-rt-frontend-jaxws</artifactId>
                <version>${cxf.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-rt-transports-http</artifactId>
                <version>${cxf.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-rt-transports-http-jetty</artifactId>
                <version>${cxf.version}</version>
            </dependency>
        </dependencies>
    
    
  2. Далее необходимо добавить в pom.xml cxf-codegen-plugin:
    
    <plugins>
        <plugin>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-codegen-plugin</artifactId>
            <version>${cxf.version}</version>
            <executions>
                <execution>
                    <id>generate-sources</id>
                    <phase>generate-sources</phase>
                    <configuration>
                        <sourceRoot>${basedir}/src/main/java</sourceRoot>
                        <wsdlOptions>
                            <wsdlOption>
                                <wsdl>Ссылка на wsdl</wsdl>
                            </wsdlOption>
                        </wsdlOptions>
                    </configuration>
                    <goals>
                        <goal>wsdl2java</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
    
     
  3. Если хотим чтобы даты преобразовывались не в XMLGregorianCalendar, а во что-то более привычное (например: JodaTime), необходимо настроить связывание. Добавляем следующие строки в  элемент wsdlOption в pom.xml:
    
    ...
    
    <wsdlOptions>
      <wsdlOption>
        <wsdl>Ссылка на wsdl</wsdl>
        <bindingFiles>
          <bindingFile>${basedir}/src/main/resources/bindings.xml</bindingFile>
        </bindingFiles>
      </wsdlOption>
    </wsdlOptions>
    
    ...
    
    
  4. В папке ресурсов создаем файл bindings.xml со следующим содержимым:
    
    <xs:schema elementFormDefault="qualified" version="1.0" 
               xmlns:xs="http://www.w3.org/2001/XMLSchema" 
               xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
               jaxb:version="2.0" targetNamespace="calendar-schemalet">
      <xs:annotation>
        <xs:appinfo>
          <jaxb:globalBindings>
            <jaxb:javaType name="org.joda.time.DateTime" 
                           xmlType="xs:dateTime" 
                           parseMethod="DateTimeAdapter.unmarshal"
                           printMethod="DateTimeAdapter.marshal"
            />
          </jaxb:globalBindings>
        </xs:appinfo>
      </xs:annotation>
    </xs:schema>
    
    
  5. В аттрибутах parseMethod и printMethod указываеются методы которые будут преобразовывать дату в строку и обратно. Такой класс может выглядеть примерно так:
    
    public class DateTimeAdapter {
     
        public static DateTime unmarshal(String v){
            return new DateTime(v);
        }
     
        public static String marshal(DateTime v){
            return v.toString();
        }
    }
    
  6. Не забываем подключить JodaTime в качестве зависимости:
    
    ...
    <dependency>
      <groupId>joda-time</groupId>
      <artifactId>joda-time</artifactId>
      <version>2.3</version>
      <type>jar</type>
    </dependency>
    ...
    
  7. Вызываем цели maven clean install и смотрим как CXF plugin генерирует код клиента.
  8. После того как все необходимые классы были сгенерированы создаем сам клиент:
    
    //Создаем сервис
    Service service = new Service();
    //Получаем порт
    Port port = service.getPort();
    
    //Создаем интерцептор для логирования исходящих сообщений
    LoggingOutInterceptor loi = new LoggingOutInterceptor();
    
    //Создаем интерцептор для логирования входящих сообщений
    LoggingInInterceptor lii = new LoggingInInterceptor(); //Регистрируем интерцепторы ClientProxy.getClient(port).getEndpoint().getInInterceptors().add(lii); ClientProxy.getClient(port).getEndpoint().getOutInterceptors().add(loi); ClientProxy.getClient(port).getEndpoint().getOutFaultInterceptors().add(loi); //TODO: создание исходящего сообщения и вызов метода сервиса через объект port.

Комментариев нет:

Отправить комментарий