Nếu bạn muốn tạo một WebService sử dụng công nghệ JAX-WS (Java API for XML Web Services) thì bài viết này tổng hợp lại các bước và hướng dẫn bạn tạo ra một WebService có tùy biến phức tạp hơn sử dụng Maven Project. Ví dụ như bạn cần định nghĩa tên của tham số truyền vào, kết quả dữ liệu trả về … giúp client có thể gọi service một cách rõ ràng, minh bạch và hướng dịch vụ.

JAX-WS hỗ trợ các chuẩn sau đây:

  • JAX-WS 2.0/2.1/2.2 (JSR 224)
  • WS-I Basic Profile 1.2 and 2.0
  • WS-I Attachments Profile 1.0
  • WS-I Simple SOAP Binding Profile 1.0
  • WS-Addressing 1.0 – Core, SOAP Binding, WSDL Binding

Một phần mã nguồn demo là dự án thực tế về Wifi Controller mà công ty VNPT Technology tôi đang làm. Ở đây Maven được sử dụng để build project và deploy WebService chúng ta tạo ra.

1. Tạo mới Server project

Sau khi tạo xong maven Project, trong file pom.xml hãy add dependency cần sử dụng trong chương trình. Build project để các lib được tải và cập nhật về repo local. Chú ý là ta quan tâm đến dependency: jaxws-rt-2.2.8

        <dependency>
            <groupid>com.sun.xml.ws</groupId>
            <artifactid>jaxws-rt</artifactId>
            <version>2.2.8</version>
        </dependency>

2. Tạo WebService

Chúng ta cần khai báo một SEI. Service Endpoint Interface (SEI) là interface chứa các khai báo, định nghĩa methods mà client có thể gọi tới service.

/*
 * Copyright 2014 VNPT-Technology. All rights reserved.
 * VNPT-Technology PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */
package net.vnpttech.ws.demo;

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import net.vnpttech.acs.ws.BasicResult;

/**
 *
 * @author Vunb
 * @date Jun 10, 2014
 * @update Jun 10, 2014
 */
@WebService
@SOAPBinding(style = SOAPBinding.Style.DOCUMENT,
        use = SOAPBinding.Use.LITERAL,
        parameterStyle = SOAPBinding.ParameterStyle.WRAPPED)
public interface ACSWebService {

    @WebMethod
    String ping();

    // WAN CONFIGURATION
    @WebMethod
    BasicResult configTunnelMode(String serialNumber, String urlRequestCpe, int mode);

    @WebMethod
    BasicResult configWanEthernetPort(String serialNumber, String urlRequestCpe, String port);

}

Tiếp tục, hãy tạo một lớp tên là ACSWebServiceImpl.java và thực hiện đoạn mã tương tự sau đây:

/*
 * Copyright 2014 VNPT-Technology. All rights reserved.
 * VNPT-Technology PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */
package net.vnpttech.ws.demo;

import javax.jws.WebResult;
import javax.jws.WebService;

/**
 *
 * @author Vunb
 * @date Jun 10, 2014
 * @update Jun 10, 2014
 */
@WebService(serviceName = WebServiceConfig.WS_SERVICE_NAME,
        name = WebServiceConfig.WS_NAME,
        targetNamespace = WebServiceConfig.WS_TARGET_NAMESPACE)
public class ACSWebServiceImpl implements ACSWebService {

    @Override
    @WebResult(targetNamespace = WebServiceConfig.WS_NAMESPACE_APMANAGEMENT)
    public String ping() {
        return "pong";
    }

    @Override
    @WebResult(targetNamespace = WebServiceConfig.WS_NAMESPACE_APMANAGEMENT)
    public BasicResult configTunnelMode(String serialNumber, String urlRequestCpe, int mode) {
        BasicResult result = new BasicResult();
        try {
            String retValue = "Something value";
            String description = "I'm doing stuff !";
            result.setErrorCode(0);
            result.setRetValue(retValue);
            result.setMessage(description);
            return result;
        } catch (Exception ex) {
            result.setErrorCode(WebServiceConfig.ErrorCode.CPE_CONFIG_ERROR);
            result.setMessage(ex.getMessage());
            return result;
        }
    }

    @Override
    @WebResult(targetNamespace = WebServiceConfig.WS_NAMESPACE_APMANAGEMENT)
    public BasicResult configWanEthernetPort(String serialNumber, String urlRequestCpe, String port) {
        BasicResult result = new BasicResult();
        try {
            boolean retValue = true;
            String description = "I'm doing stuff !";
            result.setErrorCode(0);
            result.setRetValue(retValue);
            result.setMessage(description);
            return result;
        } catch (Exception ex) {
            result.setErrorCode(WebServiceConfig.ErrorCode.CPE_CONFIG_ERROR);
            result.setMessage(ex.getMessage());
            return result;
        }
    }

}

Lớp BasicResult.java định nghĩa kết quả trả về cho client như sau:

/*
 * Copyright 2014 VNPT-Technology. All rights reserved.
 * VNPT-Technology PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */
package net.vnpttech.ws.demo;

/**
 *
 * @author Vunb
 * @date Jun 9, 2014
 * @update Jun 9, 2014
 */
public class BasicResult {

    private int errorCode;
    private String message;
    private String retValue;

    public BasicResult() {
        this.errorCode = 0;
        this.message = "(not provided)";
        this.retValue = "(not provided)";
    }

    public int getErrorCode() {
        return errorCode;
    }

    public void setErrorCode(int errorCode) {
        this.errorCode = errorCode;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getRetValue() {
        return retValue;
    }

    public void setRetValue(String retValue) {
        this.retValue = retValue;
    }

    public void setRetValue(Object retValue) {
        this.retValue = String.valueOf(retValue);
    }
}

Và một lớp WebServiceConfig.java định nghĩa các cấu hình cho web service.

/*
 * Copyright 2014 VNPT-Technology. All rights reserved.
 * VNPT-Technology PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */
package net.vnpttech.ws.demo;

/**
 *
 * @author Vunb
 * @date Jun 9, 2014
 * @update Jun 9, 2014
 */
public class WebServiceConfig {

    public static final String WS_SERVICE_NAME = "APConfigService";
    public static final String WS_NAME = "APConfig";
    public static final String WS_TARGET_NAMESPACE = "http://ws.acs.vnpttech.net";

    public static final String WS_NAMESPACE_APMANAGEMENT = WS_TARGET_NAMESPACE + "/apmanagement";
    public static final String WS_NAMESPACE_WLAN_CONFIG = WS_TARGET_NAMESPACE + "/wlanconfig";
    public static final String WS_NAMESPACE_DEVICE_INFO = WS_TARGET_NAMESPACE + "/deviceinfo";

    public class ErrorCode {

        public static final int SUCCESS = 0;
        public static final int SYSTEM_FAIL = -1;
        public static final int CPE_CONNECTION_ERROR = 1;
        public static final int CPE_CONFIG_ERROR = 2;

    }

}

3. Publish dịch vụ WebService

Điều cuối cùng mà chúng ta cần làm là publish dịch vụ đã tạo ở trên bằng hàm main sau đây:

/*
 * Copyright 2014 VNPT-Technology. All rights reserved.
 * VNPT-Technology PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */
package net.vnpttech.ws.demo;

import javax.xml.ws.Endpoint;

/**
 *
 * @author Vunb
 * @date Jun 5, 2014
 * @update Jun 5, 2014
 */
public class ACSWebServicePublisher {

    public static final String WS_HOSTNAME_KEY = "net.vnpttech.acs.ws.StartWebservice.hostname";
    public static final String WS_PORT_KEY = "net.vnpttech.acs.ws.StartWebservice.port";
    public static final String WS_CONTEXT_KEY = "net.vnpttech.acs.ws.StartWebservice.context";

    public static void main(String[] args) {
        String hostName = System.getProperty(WS_HOSTNAME_KEY, "0.0.0.0");
        String port = System.getProperty(WS_PORT_KEY, "9000");
        String context = System.getProperty(WS_CONTEXT_KEY, "/acs/ws");
        StringBuilder sb = new StringBuilder();
        sb.append("http://")
                .append(hostName)
                .append(":")
                .append(port)
                .append(context)
                .append("?wsdl");
        String serviceAddress = sb.toString();
        Endpoint.publish(serviceAddress, new ACSWebServiceImpl());
        System.out.println("Published Address: " + serviceAddress);
    }
}

Kết quả khi view bằng SOAP UI 5.0
Hoặc truy cập trực tiếp trên browser để kiểm tra, địa chỉ: http://localhost:9001/acs/ws?wsdl

WebService-JAX-WS-project

WebService-JAX-WS

Chúc thành công !

About The Author