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

Создание веб-службы SOAP с помощью Spring

Узнайте, как создать веб-службу на основе SOAP с помощью Spring Boot

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

1. Обзор

В этом уроке мы увидим, как создать веб-службу на основе SOAP с помощью веб-служб Spring Boot Starter.

2. Веб-сервисы SOAP

Короче говоря, веб-служба-это независимая от платформы служба, которая позволяет осуществлять связь по сети.

SOAP-это протокол обмена сообщениями. Сообщения (запросы и ответы) являются XML-документами по протоколу HTTP . XML-контракт определяется WSDL (Язык описания веб-служб). Он предоставляет набор правил для определения сообщений, привязок, операций и местоположения службы.

XML, используемый в SOAP, может стать чрезвычайно сложным. По этой причине лучше всего использовать SOAP с фреймворком, таким как JAX-WS или Spring, как мы увидим в этом уроке.

3. Стиль разработки “Контракт-Первый”

Существует два возможных подхода при создании веб-службы: Контракт-Последний и Контракт-Первый . Когда мы используем подход, основанный на контракте, мы начинаем с кода Java и генерируем контракт веб-службы ( WSDL ) из классов. При использовании contract-first, мы начинаем с контракта WSDL, из которого мы генерируем классы Java.

Spring-WS поддерживает только стиль разработки, основанный на контракте.

4. Настройка проекта Spring Boot

Мы собираемся создать проект Spring Boot, в котором мы определим наш сервер SOAP WS.

4.1. Зависимости Maven

Давайте начнем с добавления spring-boot-starter-parent в наш проект:


    org.springframework.boot
    spring-boot-starter-parent
    2.4.0

Далее, давайте добавим spring-boot-starter-web-services и wsdl4j зависимости:


    org.springframework.boot
    spring-boot-starter-web-services


    wsdl4j
    wsdl4j

4.2. Файл XSD

Подход, основанный на контракте, требует, чтобы мы сначала создали домен (методы и параметры) для нашего сервиса. Мы собираемся использовать файл схемы XML (XSD), который Spring-WS автоматически экспортирует в виде WSDL:




    
        
            
                
            
        
    

    
        
            
                
            
        
    

    
        
            
            
            
            
        
    

    
        
            
            
            
        
    

В этом файле мы видим формат запроса getCountryRequest веб-службы . Мы определяем его так, чтобы он принимал один параметр типа string .

Далее мы определяем формат ответа, который содержит объект типа страна .

Наконец, мы видим объект currency , используемый в объекте country .

4.3. Создание классов Java домена

Теперь мы создадим классы Java из файла XSD, определенного в предыдущем разделе. jaxb2-maven-плагин сделает это автоматически во время сборки. Плагин использует инструмент XJC в качестве механизма генерации кода. XJC компилятор файла схемы XSD в полностью аннотированные классы Java.

Давайте добавим и настроим плагин в вашем pom.xml:


    org.codehaus.mojo
    jaxb2-maven-plugin
    1.6
    
        
            xjc
            
                xjc
            
        
    
    
        ${project.basedir}/src/main/resources/
        ${project.basedir}/src/main/java
        false
    

Здесь мы замечаем две важные конфигурации:

  • ${project.basedir}/src/main/resources – Расположение XSD-файла
  • ${project.basedir}/src/main/java – Где мы хотим, чтобы наш код Java был сгенерирован

Для создания классов Java мы могли бы просто использовать инструмент xjc из нашей установки Java. Хотя в нашем проекте Maven все еще проще, так как классы будут автоматически генерироваться во время обычной сборки Maven:

mvn compile

4.4. Добавьте конечную точку веб-службы SOAP

Класс конечной точки веб-службы SOAP будет обрабатывать все входящие запросы для службы. Он инициирует обработку и отправит ответ обратно.

Прежде чем определить это, мы создаем репозиторий Country для предоставления данных веб-службе.

@Component
public class CountryRepository {

    private static final Map countries = new HashMap<>();

    @PostConstruct
    public void initData() {
        // initialize countries map
    }

    public Country findCountry(String name) {
        return countries.get(name);
    }
}

Далее, давайте настроим конечную точку:

@Endpoint
public class CountryEndpoint {

    private static final String NAMESPACE_URI = "http://www.baeldung.com/springsoap/gen";

    private CountryRepository countryRepository;

    @Autowired
    public CountryEndpoint(CountryRepository countryRepository) {
        this.countryRepository = countryRepository;
    }

    @PayloadRoot(namespace = NAMESPACE_URI, localPart = "getCountryRequest")
    @ResponsePayload
    public GetCountryResponse getCountry(@RequestPayload GetCountryRequest request) {
        GetCountryResponse response = new GetCountryResponse();
        response.setCountry(countryRepository.findCountry(request.getName()));

        return response;
    }
}

Вот несколько деталей, которые следует отметить:

  • @Endpoint – регистрирует класс с помощью Spring WS в качестве конечной точки веб-службы
  • @PayloadRootопределяет метод обработчика в соответствии с атрибутами namespace и localPart
  • @ResponsePayload – указывает, что этот метод возвращает значение, которое будет сопоставлено с полезной нагрузкой ответа
  • @RequestPayload – указывает, что этот метод принимает параметр, который будет сопоставлен с входящим запросом

4.5. Компоненты конфигурации Веб-службы SOAP

Теперь давайте создадим класс для настройки Spring messagedispatcherservlet для получения запроса:

@EnableWs
@Configuration
public class WebServiceConfig extends WsConfigurerAdapter {
    // bean definitions
}

@@Включает включает функции веб-службы SOAP в этом приложении Spring Boot. Класс Web Service Config расширяет базовый класс WsConfigurerAdapter , который настраивает управляемую аннотациями модель программирования Spring-WS.

Давайте создадим MessageDispatcherServlet , который используется для обработки запросов SOAP:

@Bean
public ServletRegistrationBean messageDispatcherServlet(ApplicationContext applicationContext) {
    MessageDispatcherServlet servlet = new MessageDispatcherServlet();
    servlet.setApplicationContext(applicationContext);
    servlet.setTransformWsdlLocations(true);
    return new ServletRegistrationBean(servlet, "/ws/*");
}

Мы устанавливаем введенный ApplicationContext объект сервлета , чтобы Spring-WS мог найти другие компоненты Spring.

Мы также включаем преобразование сервлета расположения WSDL. Это преобразует атрибут местоположения soap:address в WSDL так, чтобы он отражал URL-адрес входящего запроса.

Наконец, давайте создадим объект DefaultWsdl11Definition . Это предоставляет стандартный WSDL 1.1 с использованием схемы Xsd. Имя WSDL будет таким же, как имя компонента.

@Bean(name = "countries")
public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema countriesSchema) {
    DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
    wsdl11Definition.setPortTypeName("CountriesPort");
    wsdl11Definition.setLocationUri("/ws");
    wsdl11Definition.setTargetNamespace("http://www.baeldung.com/springsoap/gen");
    wsdl11Definition.setSchema(countriesSchema);
    return wsdl11Definition;
}

@Bean
public XsdSchema countriesSchema() {
    return new SimpleXsdSchema(new ClassPathResource("countries.xsd"));
}

5. Тестирование проекта SOAP

Как только конфигурация проекта будет завершена, мы готовы ее протестировать.

5.1. Создание и запуск проекта

Можно было бы создать файл WAR и развернуть его на внешнем сервере приложений. Вместо этого мы будем использовать Spring Boot, который является более быстрым и простым способом запуска и запуска приложения.

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

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Обратите внимание, что мы не используем никаких XML-файлов (например, web.xml) для создания этого приложения. Это все чистая Java.

Теперь мы готовы к созданию и запуску приложения:

mvn spring-boot:run

Чтобы проверить, правильно ли работает приложение, мы можем открыть WSDL по URL: http://localhost:8080/ws/countries.wsdl

5.2. Проверка запроса на МЫЛО

Чтобы проверить запрос, мы создаем следующий файл и называем его request.xml:


    
    
        
            Spain
        
    

Чтобы отправить запрос на наш тестовый сервер, мы могли бы использовать внешние инструменты, такие как SoapUI или расширение Google Chrome Wizdler. Другой способ-выполнить следующую команду в нашей оболочке:

curl --header "content-type: text/xml" -d @request.xml http://localhost:8080/ws

Полученный ответ может быть нелегко прочитать без отступов или разрывов строк.

Чтобы увидеть его отформатированным, мы можем скопировать и вставить его на нашу СТОРОНУ или в другой инструмент. Если мы установили xmllib2, мы можем передать вывод нашей команды curl в xmllint :

curl [command-line-options] | xmllint --format -

Ответ должен содержать информацию об Испании:




    
        
            Spain
            46704314
            Madrid
            EUR
        
    


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

В этой статье мы узнали, как создать веб-службу SOAP с помощью Spring Boot. Мы также узнали, как генерировать Java-код из XSD-файла, и увидели, как настроить компоненты Spring, необходимые для обработки запросов SOAP.

Полный исходный код доступен на GitHub .