Статьи

Приложение веб-службы с JAX-WS и Spring

1. Введение

Это было долгое ожидание, но я наконец публикую учебник по созданию первого приложения на основе SOAP с использованием Spring. JAX-WS (Java API для XML-веб-сервисов) — это набор API-интерфейсов для создания веб-сервисов в формате XML, который мы также чаще всего называем веб-сервисом на основе SOAP , который, как мы надеемся, всем нам известен базовая архитектура.

2. Реализация

Для начала давайте проверим конфигурацию файла pom —

pom.xml

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!-- Spring dependencies -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>4.2.1.RELEASE</version>
</dependency>
  
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>4.2.1.RELEASE</version>
</dependency>
  
<!-- JAX-WS -->
<dependency>
    <groupId>org.jvnet.jax-ws-commons.spring</groupId>
    <artifactId>jaxws-spring</artifactId>
    <version>1.9</version>
</dependency>
  
<dependency>
    <groupId>com.sun.xml.ws</groupId>
    <artifactId>jaxws-rt</artifactId>
    <version>2.2.8</version>
</dependency>

web.xml

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="ISO-8859-1"?>
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
         id="WebApp_ID" version="2.5">
  
    <display-name>SOAPWebServiceExample</display-name>
  
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
     
    <servlet>
        <servlet-name>customer</servlet-name>
        <servlet-class>com.sun.xml.ws.transport.http.servlet.WSSpringServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
     
    <servlet-mapping>
        <servlet-name>customer</servlet-name>
        <url-pattern>/customer</url-pattern>
    </servlet-mapping>
  
</web-app>

Давайте создадим объект Customer для нашего приложения.

Customer.java

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
package com.jcombat.entity;
  
public class Customer {
    private int id;
    private String name;
  
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

Давайте теперь создадим интерфейс сервиса и соответствующий ему класс реализации сервиса.

CustomerService.java

1
2
3
4
5
6
7
package com.jcombat.services.customers;
  
import com.jcombat.entity.Customer;
  
public interface CustomerService {
    public Customer getCustomerById(String customerId);
}

CustomerServiceImpl.java

01
02
03
04
05
06
07
08
09
10
11
12
13
package com.jcombat.services.customers;
  
import com.jcombat.entity.Customer;
  
public class CustomerServiceImpl implements CustomerService {
  
    public Customer getCustomerById(String customerId) {
        Customer customer = new Customer();
        customer.setId(123);
        customer.setName("Abhimanyu");
        return customer;
    }
}

Ниже показано, как должен выглядеть applicationContext .

applicationContext.xml

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="UTF-8"?>
  
    <bean id="customerService" class="com.jcombat.services.customers.CustomerServiceImpl">
    </bean>
  
    <bean id="customerEndpoint" class="com.jcombat.ws.CustomerEndpoint">
        <property name="service" ref="customerService" />
    </bean>
  
    <wss:binding url="/customer">
        <wss:service>
            <ws:service bean="#customerEndpoint" />
        </wss:service>
    </wss:binding>
  
</beans>

Обратите внимание, что шаблон URL ( / customer ) связан с классом реализации конечной точки веб-службы ( customerEndpoint ), как видно из приведенного выше фрагмента. Ниже показано, как выглядит наш класс реализации bean-компонента customerEndpoint .

CustomerEndpoint.java

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.jcombat.ws;
  
import javax.jws.WebMethod;
import javax.jws.WebService;
  
import com.jcombat.entity.Customer;
import com.jcombat.services.customers.CustomerService;
  
@WebService(serviceName = "customerService")
public class CustomerEndpoint {
    private CustomerService service;
  
    @WebMethod(exclude = true)
    public void setService(CustomerService service) {
        this.service = service;
    }
  
    @WebMethod(operationName = "getCustomer")
    public Customer getCustomerById(String customerId) {
        Customer customer = service.getCustomerById(customerId);
        return customer;
    }
  
}

Обратите внимание, что аннотация @WebService указывает среде выполнения сервера выставлять все открытые методы этого класса в качестве методов веб-службы. Если мы хотим, чтобы какой-либо из методов не отображался в качестве метода веб-службы, нам нужно пометить метод с помощью @WebMethod (exclude = true) , как видно из приведенного выше фрагмента. Точно так же, если мы хотим присвоить методу метода веб-службы что-то, отличное от фактического имени метода, указанного в классе ( getCustomerById () ), нам нужно добавить атрибут operationName в аннотацию @WebMethod .

  • Если у вас возникли проблемы с зависимостями при настройке проекта, вы можете обратиться по этой ссылке .

3. Запуск приложения

  • HTTP: // локальный: 8080 / SOAPWebServiceExample / клиент WSDL

Как только мы нажмем на указанный выше URL, мы сможем увидеть содержимое WSDL, как видно на снимке ниже.

WSDL

Мы также можем проверить конечную точку с помощью SOAP UI. Создайте новый проект SOAP с тем же расположением WSDL, как указано выше.

МЫЛО

4. Загрузите исходный код

Ссылка: Приложение веб-сервиса с JAX-WS и Spring от нашего партнера JCG Абхиманью Прасада в блоге jCombat .