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 นั่นเอง
ไม่มีความคิดเห็น:
แสดงความคิดเห็น