Как работать с WSDL SOAP в Spring?

Для работы с WSDL SOAP в Spring, вы можете использовать библиотеку Spring Web Services. Spring Web Services предоставляет простой способ создания SOAP-совместимых веб-сервисов и клиентов на основе WSDL.

Вот шаги, которые вам необходимо следовать для работы с WSDL SOAP в Spring:

1. Добавьте зависимость в ваш файл pom.xml для использования Spring Web Services:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web-services</artifactId>
</dependency>

2. Создайте класс-контроллер, который будет обрабатывать запросы SOAP. Для этого можно использовать аннотации @Endpoint и @PayloadRoot:

@Endpoint
public class SOAPController {
    
    private static final String NAMESPACE_URI = "http://yournamespace.com";
    
    @PayloadRoot(namespace = NAMESPACE_URI, localPart = "yourRequest")
    @ResponsePayload
    public YourResponse handleRequest(@RequestPayload YourRequest request) {
        // обработка запроса и возвращение ответа
    }
}

3. Создайте конфигурационный класс, где вы настраиваете ваш WSDL и создаете DefaultWsdl11Definition:

@EnableWs
@Configuration
public class WebServiceConfig extends WsConfigurerAdapter {
    
    @Bean
    public ServletRegistrationBean<MessageDispatcherServlet> messageDispatcherServlet(ApplicationContext applicationContext) {
        MessageDispatcherServlet servlet = new MessageDispatcherServlet();
        servlet.setApplicationContext(applicationContext);
        servlet.setTransformWsdlLocations(true);
        return new ServletRegistrationBean<>(servlet, "/ws/*");
    }
    
    @Bean(name = "yourService")
    public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema yourSchema) {
        DefaultWsdl11Definition definition = new DefaultWsdl11Definition();
        definition.setPortTypeName("YourServicePort");
        definition.setTargetNamespace("http://yournamespace.com");
        definition.setLocationUri("/ws");
        definition.setSchema(yourSchema);
        return definition;
    }
    
    @Bean
    public XsdSchema yourSchema() {
        return new SimpleXsdSchema(new ClassPathResource("your-schema.xsd"));
    }
}

4. Создайте файл your-schema.xsd, в котором вы определяете структуру вашего SOAP-сообщения:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://yournamespace.com"
    elementFormDefault="qualified">
    
    <xs:element name="yourRequest">
        <xs:complexType>
            <!-- определение полей запроса -->
        </xs:complexType>
    </xs:element>
    
    <xs:element name="yourResponse">
        <xs:complexType>
            <!-- определение полей ответа -->
        </xs:complexType>
    </xs:element>
</xs:schema>

5. Запустите ваше приложение и обратитесь к WSDL-схеме по адресу http://localhost:8080/ws/yourService.wsdl. Вы должны увидеть сгенерированную WSDL-схему.

6. Для создания клиента на основе WSDL, вы можете использовать классы, сгенерированные с помощью утилиты wsimport.

Но иногда целесообразно использовать технологию Spring Web Services и для создания SOAP-клиента. В этом случае вы можете использовать классы WebServiceTemplate и Jaxb2Marshaller:

@Configuration
public class SOAPClientConfig {
    
    @Bean
    public WebServiceTemplate webServiceTemplate(Jaxb2Marshaller marshaller) {
        WebServiceTemplate template = new WebServiceTemplate();
        template.setDefaultUri("http://localhost:8080/ws/yourService");
        template.setMarshaller(marshaller);
        template.setUnmarshaller(marshaller);
        return template;
    }
    
    @Bean
    public Jaxb2Marshaller marshaller() {
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
        marshaller.setContextPath("package.with.generated.classes");
        return marshaller;
    }
}

Теперь у вас есть основа для работы с WSDL SOAP в Spring. Вы можете создавать SOAP-совместимые веб-сервисы и клиенты, опираясь на сгенерированную WSDL-схему.