วันอังคารที่ 26 เมษายน พ.ศ. 2554

Spring Framework and Web Service JAX-WS on Annotation

หลังจากที่เราได้รู้เรื่องการติดต่อ Database กับไปแล้วจากบทนี้

Spring Framework and Hibernate on Annotation

ตอนนี้เราก็มารู้เรื่องเกี่ยวกับ Web Service กันต่อเลย แต่จะย่อหน่อย เป็นตัวอย่าง
เพราะจริง ๆ ก็เขียนอยู่แค่นี้เอง

ProjectCheckListWS.java
package th.go.nhso.projecttracking.webservice.service;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import th.go.nhso.projecttracking.webservice.model.ProjectPlanCodeResult;
import th.go.nhso.projecttracking.webservice.model.ProjectPlanCodeRequest;
import th.go.nhso.projecttracking.webservice.model.ProjectCheckInRequest;
import th.go.nhso.projecttracking.webservice.model.ProjectCheckInResult;
import th.go.nhso.projecttracking.webservice.model.ProjectCheckOutRequest;
import th.go.nhso.projecttracking.webservice.model.ProjectCheckOutResult;

@WebService
public interface ProjectCheckListWS {
    public ProjectPlanCodeResult getPlanCode(ProjectPlanCodeRequest planCodeReq);
    public ProjectCheckInResult checkIn(ProjectCheckInRequest checkInReq);
    public ProjectCheckOutResult checkOut(ProjectCheckOutRequest checkOutReq);
}


ProjectCheckListWSImpl
package th.go.nhso.projecttracking.webservice.service;

import javax.jws.WebMethod;
import javax.jws.WebService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.context.support.SpringBeanAutowiringSupport;
import th.go.nhso.projecttracking.service.ProjectCheckListService;
import th.go.nhso.projecttracking.webservice.model.ProjectPlanCodeRequest;
import th.go.nhso.projecttracking.webservice.model.ProjectPlanCodeResult;
import th.go.nhso.projecttracking.webservice.model.ProjectCheckInRequest;
import th.go.nhso.projecttracking.webservice.model.ProjectCheckInResult;
import th.go.nhso.projecttracking.webservice.model.ProjectCheckOutRequest;
import th.go.nhso.projecttracking.webservice.model.ProjectCheckOutResult;

@WebService(serviceName = "ProjectCheckListWebService")
public class ProjectCheckListWSImpl extends SpringBeanAutowiringSupport implements ProjectCheckListWS {

    @Autowired
    private ProjectCheckListService service;

    @Override
    @WebMethod
    public ProjectCheckInResult checkIn(ProjectCheckInRequest req) {
        return service.checkIn(req);
    }

    @Override
    @WebMethod
    public ProjectCheckOutResult checkOut(ProjectCheckOutRequest req) {
        return service.checkOut(req);
    }

    @Override
    @WebMethod
    public ProjectPlanCodeResult getPlanCode(ProjectPlanCodeRequest req) {
        return service.getPlanCode(req);
    }

}


หรือในอีกกรณีคือ ประกาศ endpointInterface ให้กับ ตัว implement แต่วิธีนี้ spring จะสามารถ ผูก service (autowired) ได้ และต้อง extends SpringBeanAutowiringSupport ด้วย มิฉะนั้น service จะ null ได้
ตอนสร้าง service ครั้งแรกไปดูสลับกับ CXF Web Service เลยก็งง ๆ อยู่ เหมือนกันมาก

model ที่ใช้ ส่งค่า parameter นั้นต้องมีการประกาศอะไรเพิ่มเติมนิดหน่อย ตัวอย่าง

BaseProjectCheckRequest.java
package th.go.nhso.projecttracking.webservice.model;

import java.io.Serializable;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;

@XmlAccessorType(XmlAccessType.FIELD)
public abstract class BaseProjectCheckRequest implements Serializable {
    
    public String projectCode;
    
    public String projectPlanCode;
    
    public String processCode;
    
    public String processSubCode;
    
    private String postBy;
    
    private String postLocation;

    public String getPostBy() {
        return postBy;
    }

    public void setPostBy(String postBy) {
        this.postBy = postBy;
    }

    public String getPostLocation() {
        return postLocation;
    }

    public void setPostLocation(String postLocation) {
        this.postLocation = postLocation;
    }

    public String getProcessCode() {
        return processCode;
    }

    public void setProcessCode(String processCode) {
        this.processCode = processCode;
    }

    public String getProcessSubCode() {
        return processSubCode;
    }

    public void setProcessSubCode(String processSubCode) {
        this.processSubCode = processSubCode;
    }

    public String getProjectCode() {
        return projectCode;
    }

    public void setProjectCode(String projectCode) {
        this.projectCode = projectCode;
    }

    public String getProjectPlanCode() {
        return projectPlanCode;
    }

    public void setProjectPlanCode(String projectPlanCode) {
        this.projectPlanCode = projectPlanCode;
    }
}

ProjectCheckInRequest.java
package th.go.nhso.projecttracking.webservice.model;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class ProjectCheckInRequest extends BaseProjectCheckRequest {

}

ก็คือ มีการกำหนด xml type เข้าไปด้วย ไม่อย่างนั้นมันจะมีข้อผิดพลาดเกิดขึ้น
@XmlAccessorType(XmlAccessType.FIELD) << ถ้าไม่ใส่ จะเกิดการเรียกสองครั้ง คือ ครั้งแรกจะไปเรียก attribute ก่อน แล้ว มันก็จะไปเรียก get method อีกที แล้วก็ฟ้องว่ามีการประกาศ attribute สองตัวเหมือนกัน ใน class เดียว -_-" อ่าว โง่หนิ !!!
@XmlRootElement << เพื่อบอกว่า ให้เอา attribute ของ root มาเป็นของตัวเองด้วย ไม่งั้นมันจะว่างเปล่า ไม่มี attribute เลย เพราะ class ลูกเราก็ไม่ค่อยได้เขียนอะไรอยู่แล้ว

ส่วนละเอียด service ก็จะเป็นประมาณนี้

ProjectCheckListService.java
package th.go.nhso.projecttracking.service;

import th.go.nhso.projecttracking.webservice.model.ProjectCheckInRequest;
import th.go.nhso.projecttracking.webservice.model.ProjectCheckInResult;
import th.go.nhso.projecttracking.webservice.model.ProjectCheckOutRequest;
import th.go.nhso.projecttracking.webservice.model.ProjectCheckOutResult;
import th.go.nhso.projecttracking.webservice.model.ProjectPlanCodeRequest;
import th.go.nhso.projecttracking.webservice.model.ProjectPlanCodeResult;

public interface ProjectCheckListService {
    public ProjectCheckInResult checkIn(ProjectCheckInRequest request);    
    public ProjectCheckOutResult checkOut(ProjectCheckOutRequest request);
    public ProjectPlanCodeResult getPlanCode(ProjectPlanCodeRequest request);
}


ProjectCheckListService.java
package th.go.nhso.projecttracking.service;

import java.util.Date;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import th.go.nhso.projecttracking.dao.ProcessTranDao;
import th.go.nhso.projecttracking.model.ProcessTran;
import th.go.nhso.projecttracking.webservice.model.ProjectCheckInRequest;
import th.go.nhso.projecttracking.webservice.model.ProjectCheckInResult;
import th.go.nhso.projecttracking.webservice.model.ProjectCheckOutRequest;
import th.go.nhso.projecttracking.webservice.model.ProjectCheckOutResult;
import th.go.nhso.projecttracking.webservice.model.ProjectPlanCodeRequest;
import th.go.nhso.projecttracking.webservice.model.ProjectPlanCodeResult;

@Service
public class ProjectCheckListServiceImpl implements ProjectCheckListService {
    private static String STEP_IN = "START";
    private static String STEP_OUT = "FINISH";
    
    @Autowired
    private ProcessTranDao processTranDao;
    
    @Override
    public ProjectCheckInResult checkIn(ProjectCheckInRequest request) {
        ProcessTran t = new ProcessTran();
        this.setReqeq2Tran(t, request);
        processTranDao.insert(t);
        
        ProjectCheckInResult result = new ProjectCheckInResult();
        result.setCode("200");
        result.setDescription("SUCCESS");
        return result;
    }

    @Override
    public ProjectCheckOutResult checkOut(ProjectCheckOutRequest request) {
        ProcessTran t = new ProcessTran();
        this.setReqeq2Tran(t, request);
        processTranDao.insert(t);
        
        
        ProjectCheckOutResult result = new ProjectCheckOutResult();
        result.setCode("200");
        result.setDescription("SUCCESS");
        return result;
    }

    private void setReqeq2Tran(ProcessTran t, ProjectCheckInRequest r) {
        t.setProjectId(Long.MIN_VALUE);
        t.setProjectPlanId(Long.MIN_VALUE);
        t.setProcessId(Long.MIN_VALUE);
        t.setProcessSubId(Long.MIN_VALUE);
        t.setCreateDate(new Date());
        t.setCreateBy(r.getPostLocation());
        t.setStep(STEP_IN);
    }
    
    
    private void setReqeq2Tran(ProcessTran t, ProjectCheckOutRequest r) {
        t.setProjectId(Long.MIN_VALUE);
        t.setProjectPlanId(Long.MIN_VALUE);
        t.setProcessId(Long.MIN_VALUE);
        t.setProcessSubId(Long.MIN_VALUE);
        t.setCreateDate(new Date());
        t.setCreateBy(r.getPostLocation());
        t.setStep(STEP_OUT);
    }

    @Override
    public ProjectPlanCodeResult getPlanCode(ProjectPlanCodeRequest request) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    
}

ก็เป็น service ธรรมดาที่เราผูกไว้ กับ spring นั่นเอง

ไม่มีความคิดเห็น: