วันพฤหัสบดีที่ 6 พฤษภาคม พ.ศ. 2553

java web-service with cxf(2.2.7) on spring framework

ตกลงก็มามอง cxf ในการทำ web-service ทั้ง client และ server เพราะความง่าย อะอย่างพล่ามมากเลย เริ่มดีกว่า
เราก็ต้อง create project เป็น web อยู่แล้ว ในที่นี้ก็คงต้องเดินไปหา
project/WebContent/WEB-INF/web.xml แล้วก็ละเลงตามนี้




    Auth Manager

    
        contextConfigLocationclasspath:com/company/auth/service/cxf.xml
    
        org.springframework.web.context.ContextLoaderListener
    
    
        CXFServlet
        org.apache.cxf.transport.servlet.CXFServlet
    
    
        CXFServlet
        /services/*
    



ต่อไป model ตัวที่จะลาก parameter ต่าง ๆ ไป ๆ มาก ๆ
project/src/com/company/auth/bean/Employee.java
package com.company.auth.bean;

import java.io.Serializable;
import java.util.Set;

public class Employee implements Serializable {
 
 private static final long serialVersionUID = 1L;
 private String gid;
 private String lastName;
 private String firstName;
 private Set privileges;
 
 public Employee() {}

 public String getGid() {
  return gid;
 }
 public void setGid(String gid) {
  this.gid = gid;
 }
 public String getLastName() {
  return lastName;
 }
 public void setLastName(String lastName) {
  this.lastName = lastName;
 }
 public String getFirstName() {
  return firstName;
 }
 public void setFirstName(String firstName) {
  this.firstName = firstName;
 }
 public Set getPrivileges() {
  return privileges;
 }
 public void setPrivileges(Set privileges) {
  this.privileges = privileges;
 }
 
 public boolean isUserInRole(String role) {
  if(privileges == null) { return false; }
  else { return privileges.contains(role); }
 }
}

เริ่มด้วยการประกาศ service บน xml
project/src/com/company/auth/service/cxf.xml


    <import resource="classpath:META-INF/cxf/cxf.xml" />
    <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
    <jaxws:endpoint id="auth"
      implementor="com.company.auth.service.AuthServiceImpl"
      address="/cxfAuth"/>


ต่อมาก็เริ่มในส่วน service ที่จะเป็นตัวถูกเรียกใช้ง่าน
project/src/com/company/auth/service/AuthService.java
package com.company.auth.service;

import javax.jws.WebParam;
import javax.jws.WebService;
import com.company.auth.bean.Employee;

@WebService
public interface AuthService {
 Employee getEmployee(@WebParam(name="gid") String gid);
}

project/src/com/company/auth/service/AuthServiceImpl.java
package com.company.auth.service;

import javax.jws.WebService;
import com.company.auth.bean.Employee;

@WebService(endpointInterface = "com.company.auth.service.AuthService", serviceName = "corporateAuthService")
public class AuthServiceImpl implements AuthService{

 @Override
 public Employee getEmployee(String gid) {
  System.out.print("test log for apache cxf web-service... input gid : " + gid);
  return new Employee();
 }
}

หลังจากที่ทำการเขียน service ขึ้นมาเสร็จเรียบร้อยแล้วก็สั่ง run server รอไว้เลย
แล้วเราก็มาเขียน client แบบง่าย ๆ เพื่อลองเรียกใช้กัน(จริง ๆ แล้วเขียนไว้ที่ใหนก็ได้
แต่ต้องนำ model กับ interface มาด้วย แต่ในที่นี้เอาง่าย ๆ ไว้ก่อน)
project/src/com/company/auth/client/Client.java
package com.company.auth.client;

import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import com.company.auth.bean.Employee;
import com.company.auth.service.AuthService;

public class Client {

    private Client() {
    } 

    public static void main(String args[]) throws Exception {

        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();

        factory.getInInterceptors().add(new LoggingInInterceptor());
        factory.getOutInterceptors().add(new LoggingOutInterceptor());
        factory.setServiceClass(AuthService.class);
        factory.setAddress("http://localhost:8080/Test1/services/cxfAuth");
        AuthService client = (AuthService) factory.create();

        Employee employee = client.getEmployee("0223938");
        System.out.println("Server said: " + employee.getLastName() + ", " + employee.getFirstName());
        System.exit(0);

    }
}

ในส่วน ของ wsdl จะเข้าไปที่
http://localhost:8080/project/services/cxfAuth?wsdl

กรณีที่เราต้องการเขียนเฉพาะ client ให้เราไปมอง server ที่ตัว file wsdl แล้วใช้
wsdl2java

โดยเมื่อ download cxf มา จะได้ file apache-cxf-2.2.7.zip คำสั่งจะอยู่ที่
apache-cxf-2.2.7\bin\wsdl2java.bat

ก็ให้เราใช้คำสั่ง ตามหลังด้วย url ของ wsdl ได้เลย (java file และ folder ก็จะ
ออกมายัง part ที่เราใช้คำสั่ง ก็ย้ายไปไว้ที่อื่นเอาเอง)
wsdl2java http://localhost:8080/project/services/cxfAuth?wsdl

ในที่นี้ได้เป็น part : com\company\auth\service\
AuthService.java
CorporateAuthService.java
Employee.java
GetEmployee.java
GetEmployeeResponse.java
ObjectFactory.java
package-info.java

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