Рубрики
Без рубрики

Руководство по Apache CXF с весной

Быстрый учебник о том, как использовать Apache CXF с Spring Framework и как настроить его с помощью Java или XML.

Автор оригинала: baeldung.

1. Обзор

Этот учебник фокусируется на настройке и с помощью Apache CXF рамки вместе с весенними – либо с конфигурацией Java или XML.

Это второй в серии на Apache CXF; первый из них был посвящен основам CXF как реализации стандартных API JAX-WS.

2. Мейвен зависимостей

Как и в предыдущем учебнике, следующие две зависимости должны быть включены:


    org.apache.cxf
    cxf-rt-frontend-jaxws
    3.1.6


    org.apache.cxf
    cxf-rt-transports-http
    3.1.6

Для последних версий артефактов Apache CXF, пожалуйста, ознакомьтесь с apache-cxf .

Кроме того, для поддержки Spring необходимы следующие зависимости:


    org.springframework
    spring-context
    4.3.1.RELEASE


    org.springframework
    spring-webmvc
    4.3.1.RELEASE

Последние версии весенних артефактов можно найти здесь .

Наконец, потому что мы будем программно настроить приложение с помощью JAVA Servlet 3.0 “API вместо традиционного веб.xml Дескриптор развертывания, нам понадобится артефакт ниже:


    javax.servlet
    javax.servlet-api
    3.1.0

Этот где мы можем найти последнюю версию API Servlet.

3. Компоненты серверной стороны

Давайте теперь посмотрим на компоненты, которые должны присутствовать на стороне сервера для того, чтобы опубликовать конечную точку веб-службы.

3.1. Интерфейс WebApplicationInitilizer

WebApplicationИнициализатор интерфейс реализован для программной настройки СервлетКонтекст интерфейс для приложения. При присутствуют на classpath, его onStartup метод автоматически вызывается контейнером сервлета, а затем СервлетКонтекст мгновенно и инициализировано.

Вот как определяется класс для реализации WebApplicationИнициализатор интерфейс:

public class AppInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext container) {
        // Method implementation
    }
}

onStartup () метод реализуется с использованием фрагментов кода, показанных ниже.

Во-первых, создается и настраивается контекст приложения Spring для регистрации класса, содержащего метаданные конфигурации:

AnnotationConfigWebApplicationContext context 
  = new AnnotationConfigWebApplicationContext();
context.register(ServiceConfiguration.class);

СервисКонфигурация класс аннотирован с @Configuration аннотация для предоставления определений фасоли. Этот класс обсуждается в следующем подразделе.

Следующий фрагмент показывает, как контекст приложения Spring добавляется в контекст сервлета:

container.addListener(new ContextLoaderListener(context));

CXF Сервлет класс, определяемый Apache CXF, генерируется и регистрируется для обработки входящих запросов:

ServletRegistration.Dynamic dispatcher 
  = container.addServlet("dispatcher", new CXFServlet());

Контекст приложения загружает элементы Spring, определенные в файле конфигурации. В этом случае имя сервлета cxf , Поэтому контекст ищет эти элементы в файле под названием cxf-сервлет.xml по умолчанию.

Наконец, сервлет CXF отображается на относительном URL::

dispatcher.addMapping("/services");

3.2. Старая добрая паутина.xml

Кроме того, если мы хотим использовать (несколько старомодный) дескриптор развертывания, а не WebApplicationИтилизатор интерфейс, соответствующий веб.xml файл должен содержать следующие определения сервлета:


    cxf
    org.apache.cxf.transport.servlet.CXFServlet
    1

    
    cxf
    /services/*

3.3. Класс сервисной самоуверенции

Давайте теперь посмотрим на конфигурацию службы – сначала основной скелет, который прилагает определения фасоли для конечной точки веб-сервиса:

@Configuration
public class ServiceConfiguration {
    // Bean definitions
}

Первый необходимый боб является СпрингБус – который поставляет расширения для Apache CXF для работы с весенней рамочной:

@Bean
public SpringBus springBus() {
    return new SpringBus();
}

EnpointImpl фасоль также должна быть создана с помощью СпрингБус боб и веб-сервис исполнителем . Эта фасоль используется для публикации конечной точки по данному адресу HTTP:

@Bean
public Endpoint endpoint() {
    EndpointImpl endpoint = new EndpointImpl(springBus(), new BaeldungImpl());
    endpoint.publish("http://localhost:8080/services/baeldung");
    return endpoint;
}

БаелдунгИмпл класс используется для реализации интерфейса веб-службы. Его определение дается в следующем подразделе.

Кроме того, мы также можем объявить конечную точку сервера в файле конфигурации XML. В частности, cxf-сервлет.xml файл ниже работает с веб.xml Дескриптор развертывания, как было определено в подразделе 3.1 и описывает точно такую же конечную точку:

Обратите внимание, что файл конфигурации XML назван в честь имени сервлета, определенного в дескрипторе развертывания, который cxf .

3.4. Определения типов

Далее – вот определение исполнителем , которые уже упоминались в предыдущем подразделе:

@WebService(endpointInterface = "com.baeldung.cxf.spring.Baeldung")
public class BaeldungImpl implements Baeldung {
    private int counter;

    public String hello(String name) {
        return "Hello " + name + "!";
    }

    public String register(Student student) {
        counter++;
        return student.getName() + " is registered student number " + counter;
    }
}

Этот класс обеспечивает реализацию для Баелдунг интерфейс конечной точки, который Apache CXF будет включать в опубликованные метаданные WSDL:

@WebService
public interface Baeldung {
    String hello(String name);
    String register(Student student);
}

Интерфейс конечной точки, а также исполнителем использовать Студенческие класс, который определяется следующим образом:

public class Student {
    private String name;

    // constructors, getters and setters
}

4. Клиентская фасоль

Чтобы воспользоваться Весенней рамочной программой, мы объявляем фасоль в @Configuration аннотированный класс:

@Configuration
public class ClientConfiguration {
    // Bean definitions
}

Фасоль с именем клиент определяется:

@Bean(name = "client")
public Object generateProxy() {
    return proxyFactoryBean().create();
}

клиент фасоль представляет собой прокси для Баелдунг веб-сервис. Он создается призывом к создать метод на JaxWsProxyFactoryBean боб, фабрика по созданию прокси JAX-WS.

JaxWsProxyFactoryBean объект создается и настраивается следующим методом:

@Bean
public JaxWsProxyFactoryBean proxyFactoryBean() {
    JaxWsProxyFactoryBean proxyFactory = new JaxWsProxyFactoryBean();
    proxyFactory.setServiceClass(Baeldung.class);
    proxyFactory.setAddress("http://localhost:8080/services/baeldung");
    return proxyFactory;
}

Завод сервисКласс свойство обозначает интерфейс веб-службы, в то время как адрес свойство указывает url-адрес для прокси для удаленных призывов.

Кроме того, для весенних бобов на стороне клиента можно вернуться к файлу конфигурации XML. Следующие элементы объявляют те же бобы, что и те, которые мы только что программно настроены выше:



    
    

5. Тестовые случаи

В этом разделе описаны тестовые случаи, используемые для иллюстрации поддержки Apache CXF для Spring. Тестовые случаи определяются в классе под названием Студенческий .

Во-первых, нам необходимо загрузить контекст приложения Spring из вышеупомянутого СервисКонфигурация класс конфигурации и кэшировать его в контекст поле:

private ApplicationContext context 
  = new AnnotationConfigApplicationContext(ClientConfiguration.class);

Далее, прокси для интерфейса конечной точки службы объявляется и загружается из контекста приложения:

private Baeldung baeldungProxy = (Baeldung) context.getBean("client");

Этот Баелдунг прокси будет использоваться в тестовых случаях, описанных ниже.

В первом тестовом случае мы доказываем это, когда привет метод локально вызывается на прокси, ответ точно такой же, как то, что конечная точка исполнителем возвращается из удаленного веб-сервиса:

@Test
public void whenUsingHelloMethod_thenCorrect() {
    String response = baeldungProxy.hello("John Doe");
    assertEquals("Hello John Doe!", response);
}

Во втором тестовом случае студенты регистрируются на курсы Baeldung, ссылаясь на регистрация метод на прокси, который, в свою очередь, называет веб-сервис. Затем эта удаленная служба вычислит номера студентов и вернет их вызывающему абоненту. Следующий фрагмент кода подтверждает то, что мы ожидаем:

@Test
public void whenUsingRegisterMethod_thenCorrect() {
    Student student1 = new Student("Adam");
    Student student2 = new Student("Eve");
    String student1Response = baeldungProxy.register(student1);
    String student2Response = baeldungProxy.register(student2);

    assertEquals("Adam is registered student number 1", student1Response);
    assertEquals("Eve is registered student number 2", student2Response);
}

6. Интеграционное тестирование

Для того, чтобы быть развернуты в качестве веб-приложения на сервере, фрагменты кода в этом учебнике должны быть упакованы в файл WAR в первую очередь. Этого можно достичь, объявив упаковочные свойство в файле POM:

war

Работа по упаковке осуществляется плагином Maven WAR:


    maven-war-plugin
    2.6
    
        false
    

Этот плагин упаковывает составленный исходный код в файл WAR. С тех пор, как мы настроили контекст сервлета с помощью Java-кода, веб.xml Дескриптор развертывания не должен быть существующим. В результате, failOnMissingWebXml имущество должно быть установлено на ложные чтобы избежать сбоя при выполнении плагина.

Мы можем следить за эта ссылка для последней версии плагина Maven WAR.

Для иллюстрации операций веб-сервиса мы создаем интеграционный тест. Этот тест сначала генерирует файл WAR и запускает встроенный сервер, затем заставляет клиентов вызывать веб-службу, проверяет последующие ответы и, наконец, останавливает сервер.

Следующие плагины должны быть включены в файл Maven POM. Для получения более подробной информации, пожалуйста, проверьте этот учебник по тестированию интеграции .

Вот плагин Maven Surefire:


    maven-surefire-plugin
    2.19.1
    
        
            StudentTest.java
        
    

Последнюю версию этого плагина можно найти здесь .

профиль раздел с id интеграционные объявляется для облегчения интеграционного теста:


   
      integration
      
         
            ...
         
      
   

Плагин Maven Cargo включен в интеграционные профиль:


    org.codehaus.cargo
    cargo-maven2-plugin
    1.5.0
    
        
            jetty9x
            embedded
        
        
            
                localhost
                8080
            
        
    
    
        
            start-server
            pre-integration-test
            
                start
            
        
        
            stop-server
            post-integration-test
            
                stop
            
        
    

Обратите внимание, что cargo.hostname и cargo.servlet.port свойства конфигурации просто включены для ясности. Эти свойства конфигурации могут быть оставлены без какого-либо влияния на приложение, так как их значения такие же, как значения по умолчанию. Этот плагин запускает сервер, ждет подключения и, наконец, останавливает сервер для выпуска системных ресурсов.

Эта ссылка позволяет нам проверить последнюю версию плагина Maven Cargo.

Плагин Maven Surefire объявляется снова, в пределах интеграционные профиля, чтобы переопределить его конфигурацию в основной построить раздела и для выполнения тестовых случаев, описанных в предыдущем разделе:


    maven-surefire-plugin
    2.19.1
    
        
            integration-test
            
                test
            
            
                
                    none
                
            
        
    

Теперь весь процесс может быть запущен командой: mvn -Пинтеграция чистая установка .

7. Заключение

Этот учебник проиллюстрировал поддержку Apache CXF для весны. В частности, было показано, как веб-служба может быть опубликована с помощью файла конфигурации Spring, и как клиент может взаимодействовать с этой службой через прокси, созданный прокси-фабрикой Apache CXF, который был объявлен в другом файле конфигурации.

Реализация всех этих примеров и фрагментов кода можно найти в связанный проект GitHub .