All Articles

Java SOAP service

Java SOAP Service

Tổng quan:

Nhắc đến SOAP thì là XML, XSD, WSDL, JAXB, JAX-WS, (Apache CXF & Spring-boot), SOAPUI.

  • WSDL: (Web Services Description Language) giống như interface mô tả methods, parameters và responses
  • XSD: (Xml Schema Definition) giống như 1 Class, mô tả kiểu dữ liệu như String, int của services (XML).
  • Có 2 cách build SOAP project: top-down (WSDL first), bottom-up (Java code)
    • Bottom-up: thường dùng cách này để build 1 SOAP server, define endpoint, lựa chọn framework, wsdl sẽ tự động được generate.
    • Top-down: thường được build cho project SOAP client, có sẵn wsdl, generate ra file java và gọi service.
  • Security:
  • Attachment files: MTOM, FileWs, FileWsImpl (upload, download methods)
  • SOAP fault: handle exception

Thông thường generate file java từ wsdl sẽ có 2 file chính là XxxService và XxxPortType, ví dụ có CustomerService.java và CustomerPortType.java

Example cách gọi SOAP client

try {
  CustomerService service = new CustomerService(new URL("http://quachson.com/example/customer?wsdl"));
  CustomerPortType portType = service.getCustomerPortType();
  GetOrderRequest request = new GetOrderRequest();
  request.setCustomerId(1L);
  GetOrderResponse response = portType.getOrders(request);
  // handle response  ...

} catch(MalformedURLException e) {
  ... write log
}

Muốn build endpoint từ java file được generated từ wsdl thì implement lại XxxPortType

Convert

  1. Thư viện JDK 1.9, 1.8, những version sau này đã bị remove như JDK 11, 17, muốn dùng thì dùng JDK 1.8 nhưng không khuyến khích dùng nhưng dùng thì vẫn được, generate java files rồi copy vào project.
    • XML Schema -------XJC-------> Java Classes
    • Java Classes ----Schemagen----> XML Schema
    • Java Objects ---runtime API---> XML
  2. Maven plugin JAXB: Generate java files from xsd download example
  3. Maven plugin Apache CFX (recommend if using spring-boot): generate java files from wsdl

Google để lấy version mới nhất

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot</artifactId>
    <version>3.4.1</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-spring-boot-starter-jaxws</artifactId>
    <version>4.1.0</version>
</dependency>

Nếu dùng Java version >10 thì nên add thêm dependency JAXB API 2.1

<dependency>
		    <groupId>javax.xml.bind</groupId>
		    <artifactId>jaxb-api</artifactId>
		    <version>2.1</version>
		</dependency>

example apache cxf plugin, google thêm thì search: cxf code-gen plugin

<build>
  <plugins>
    <plugin>
    <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-codegen-plugin</artifactId>
        <version>4.1.0</version>   <!--must the same version above -->
        <executions>
            <execution>
                <id>generate-sources</id>
                <phase>generate-sources</phase>
                <configuration>
                    <sourceRoot>${project.build.directory}/generated-sources/cxf</sourceRoot>
                    <wsdlOptions>
                        <wsdlOption>
                            <wsdl>${basedir}/src/main/resources/wsdl/query.wsdl</wsdl>			                        
                        </wsdlOption>
                    </wsdlOptions>
                </configuration>
                <goals>
                    <goal>wsdl2java</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
  </plugins>
</build>

Published Dec 26, 2024

I blog about web development and my travels