Thứ Hai, 18 tháng 2, 2008

Tích hợp Spring, Hibernate và Axis2

+ Model class
Product.java
package org.sample.model;

import java.math.BigDecimal;

public class Product {

private Integer productId;

private String productName;

private String description;

private Float weight;

private BigDecimal price;

private Integer categoryId;

public Integer getCategoryId() {
return categoryId;
}

public void setCategoryId(Integer categoryId) {
this.categoryId = categoryId;
}

public Integer getProductId() {
return productId;
}

public void setProductId(Integer productId) {
this.productId = productId;
}

public String getProductName() {
return productName;
}

public void setProductName(String productName) {
this.productName = productName;
}

public String getDescription() {
return description;
}

public void setDescription(String description) {
this.description = description;
}

public Float getWeight() {
return weight;
}

public void setWeight(Float weight) {
this.weight = weight;
}

public BigDecimal getPrice() {
return price;
}

public void setPrice(BigDecimal price) {
this.price = price;
}
}

Category.java
package org.sample.model;

public class Category {

private Integer categoryId;

private String categoryName;

public Integer getCategoryId() {
return categoryId;
}

public void setCategoryId(Integer categoryId) {
this.categoryId = categoryId;
}

public String getCategoryName() {
return categoryName;
}

public void setCategoryName(String categoryName) {
this.categoryName = categoryName;
}

}


Product.hbm.xml
version="1.0"?>
hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
      "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
package="org.sample.model">
      name="Product" table="PRODUCT">
            name="productId" column="PRODUCT_ID" type="java.lang.Integer">
                  class="increment"/>
           
            name="productName" type="java.lang.String" column="PRODUCT_NAME"/>
            name="description" type="java.lang.String" column="DESCRIPTION"/>
            name="weight" type="java.lang.Float" column="WEIGHT"/>
            name="price" type="java.math.BigDecimal" column="PRICE"/>
            name="categoryId" type="java.lang.Integer" column="CATEGORY_ID"/>
     

Category.hbm.xml
version="1.0"?>
hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
      "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
package="org.sample.model">
      name="Category" table="CATEGORY">
            name="categoryId" column="CATEGORY_ID" type="java.lang.Integer">
                  class="increment"/>
           
            name="categoryName" type="java.lang.String" column="CATEGORY_NAME"/>
     

+ Dao class
ProductDAO.java
package org.sample.dao;

import org.sample.model.Product;

public interface ProductDAO {
      public void createProduct(Product product);

      public void updateProduct(Product product);

      public void deleteProduct(Product product);

      public Product getProduct(Integer productId);

      public Product[] listAllProduct();
}

CategoryDAO.java
package org.sample.dao;

import org.sample.model.Category;

public interface CategoryDAO {

      public void createCategory(Category cat);

      public void updateCategory(Category cat);

      public void deleteCategory(Category cat);
     
      public Category getCategory(Integer categoryId);

      public Category[] getAllCategories();

}

ProductDAOImpl.java
package org.sample.dao.impl;

import org.sample.dao.ProductDAO;
import org.sample.model.Product;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

public class ProductDAOImpl extends HibernateDaoSupport implements ProductDAO {

      public void createProduct(Product product) {
            getHibernateTemplate().save(product);
      }

      @SuppressWarnings("unchecked")
      public Product[] listAllProduct() {
            Product[] products = new Product[0];
            return (Product[]) getHibernateTemplate().find("from Product").toArray(products);
      }

      public Product getProduct(Integer productId) {
            Product pro1 = (Product) getHibernateTemplate().load(Product.class,
                        productId);
            Product pro2 = new Product();
            pro2.setProductId(pro1.getProductId());
            pro2.setProductName(pro1.getProductName());
            pro2.setCategoryId(pro1.getCategoryId());
            pro2.setPrice(pro1.getPrice());
            pro2.setWeight(pro1.getWeight());
            pro2.setDescription(pro1.getDescription());
            return pro2;
      }

      public void updateProduct(Product product) {
            getHibernateTemplate().update(product);
      }

      public void deleteProduct(Product product) {
            getHibernateTemplate().delete(product);
      }

}

CategoryDAOImpl.java
package org.sample.dao.impl;

import java.util.List;

import org.sample.dao.CategoryDAO;
import org.sample.model.Category;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

public class CategoryDAOImpl extends HibernateDaoSupport implements CategoryDAO {

      public void createCategory(Category cat) {
            getHibernateTemplate().save(cat);
      }

      public void deleteCategory(Category cat) {
            getHibernateTemplate().delete(cat);
      }

      @SuppressWarnings("unchecked")
      public Category[] getAllCategories() {
            List list = getHibernateTemplate().find("from Category");
            Category[] categories = (Category[]) list.toArray();
            return categories;
      }

      public void updateCategory(Category cat) {
            getHibernateTemplate().update(cat);
      }

      public Category getCategory(Integer categoryId) {
            Category cat1 = (Category) getHibernateTemplate().get(Category.class,
                        categoryId);
            Category cat2 = new Category();
            cat2.setCategoryId(cat1.getCategoryId());
            cat2.setCategoryName(cat1.getCategoryName());
            return cat2;
      }
}

+ Service class (call dao)
ProductService.java
CategoryService.java
ProductServiceImpl.java
CategoryServiceImpl.java


+ applicationContext.xml
beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
      id="applicationContext"
            class="org.apache.axis2.extensions.spring.receivers.ApplicationContextHolder"/>
     
      id="dataSource"
            class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            name="driverClassName">
                  com.mysql.jdbc.Driver
           
            name="url">
                  jdbc:mysql://localhost:3306/product_management
           
            name="username">
                  root
           
            name="password">
                  root
           
     
     
      id="hibernateInterceptor"
            class="org.springframework.orm.hibernate3.HibernateInterceptor">
            name="sessionFactory">
                  bean="sessionFactory"/>
           
     
     
     
      id="sessionFactory"
            class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
            name="dataSource">
                  local="dataSource"/>
           
            name="mappingResources">
                 
                        org/sample/model/Category.hbm.xml
                        org/sample/model/Product.hbm.xml
                 
           
            name="hibernateProperties">
                 
                        key="hibernate.dialect">
                              org.hibernate.dialect.MySQLDialect
                        key="hibernate.show_sql">true
                 
           
          
     
     
     
      id="hibernateTemplate"
            class="org.springframework.orm.hibernate3.HibernateTemplate">
            name="sessionFactory">
                  bean="sessionFactory"/>
           
     
     
     
     
     
      id="productDao" class="org.sample.dao.impl.ProductDAOImpl">
            name="hibernateTemplate">
                  local="hibernateTemplate"/>
           
     
     
      id="productServiceTarget"
            class="org.sample.service.impl.ProductServiceImpl">
            name="productDao">
                  local="productDao"/>
           
     
     
      id="productService"
            class="org.springframework.aop.framework.ProxyFactoryBean">
            name="target">
                  local="productServiceTarget"/>
           
            name="proxyInterfaces">
                  org.sample.service.ProductService
           
            name="interceptorNames">
                 
                        hibernateInterceptor
                 
           
     
     
     
      id="categoryDao" class="org.sample.dao.impl.CategoryDAOImpl">
            name="hibernateTemplate">
                  local="hibernateTemplate"/>
           
     
     
      id="categoryServiceTarget"
            class="org.sample.service.impl.CategoryServiceImpl">
            name="categoryDao">
                  local="categoryDao"/>
           
     
     
      id="categoryService"
            class="org.springframework.aop.framework.ProxyFactoryBean">
            name="target">
                  local="categoryServiceTarget"/>
           
            name="proxyInterfaces">
                  org.sample.service.CategoryService
           
            name="interceptorNames">
                 
                        hibernateInterceptor
                 
           
     

+ services.xml
      name="SpringInit" class="org.sample.service.SpringInit">
            This web service initializes Spring.
            name="ServiceClass">
                  org.sample.service.SpringInit
            name="ServiceTCCL">composite
            name="load-on-startup">true
            name="springInit">
                 
                        class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>
           
     
      name="productService">
            name="ServiceClass">
                  org.sample.service.impl.ProductServiceImpl
            name="ServiceObjectSupplier">
                  org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier
            name="SpringBeanName">productService
           
                  mep="http://www.w3.org/2004/08/wsdl/in-only"
                        class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
                  mep="http://www.w3.org/2004/08/wsdl/in-out"
                        class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
           
     
      name="categoryService">
            name="ServiceClass">
                  org.sample.service.impl.CategoryServiceImpl
            name="ServiceObjectSupplier">
                  org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier
            name="SpringBeanName">categoryService
           
                  mep="http://www.w3.org/2004/08/wsdl/in-only"
                        class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
                  mep="http://www.w3.org/2004/08/wsdl/in-out"
                        class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
           
     

+ Client class
CreateProductSpringClient.java
UpdateProductSpringClient.java
package org.sample.client;

import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
import org.sample.model.Category;

public class UpdateCategorySpringClient {
      public static void main(String[] args) throws AxisFault {

            RPCServiceClient serviceClient = new RPCServiceClient();

            Options options = serviceClient.getOptions();

            EndpointReference targetEPR = new EndpointReference(
                        "http://127.0.0.1:8989/axis2/services/categoryService");

            options.setTo(targetEPR);

            // get products
            QName opGetCategory = new QName("http://impl.service.sample.org",
                        "getCategory");

            Object[] opGetCategoryArgs = new Object[] { new Integer(4) };
            Class[] returnTypes = new Class[] { Category.class };

            Object[] response = serviceClient.invokeBlocking(opGetCategory,
                        opGetCategoryArgs, returnTypes);

            Category cat = (Category) response[0];

            // Displaying the result
            System.out.println("CategoryId         : " + cat.getCategoryId());
            System.out.println("CategoryName       : " + cat.getCategoryName());

            // update Product
            EndpointReference targetEPR1 = new EndpointReference(
                        "http://127.0.0.1:8989/axis2/services/categoryService");

            options.setTo(targetEPR1);

            cat.setCategoryName("Games");

            Object[] opGetCategoryArgs1 = new Object[] { cat };

            System.out.println("Category id:" + cat.getCategoryId());

            QName opGetCategory1 = new QName("http://impl.service.sample.org",
                        "updateCategory");

            serviceClient.invokeRobust(opGetCategory1, opGetCategoryArgs1);

            System.out.println("xong roi");
      }
}

DeleteProductSpringClient.java
ListProductSpringClient.java
package org.sample.client;

import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
import org.sample.model.Product;

public class ListProductSpringClient {
      public static void main(String[] args) throws AxisFault {
            RPCServiceClient serviceClient = new RPCServiceClient();

            Options options = serviceClient.getOptions();

            EndpointReference targetEPR = new EndpointReference(
                        "http://127.0.0.1:8989/axis2/services/productService");

            options.setTo(targetEPR);

            // get products
            QName opGetProduct = new QName("http://impl.service.sample.org",
                        "listAllProduct");

            Object[] opGetProductArgs = new Object[] {};
            Class[] returnTypes = new Class[] { Product[].class };

            Object[] response = serviceClient.invokeBlocking(opGetProduct,
                        opGetProductArgs, returnTypes);

            Product[] products = (Product[]) response[0];
           
            for (int i = 0; i < products.length; i++) {
                  Product pro = (Product) products[i];
                  System.out.println("product name:" + pro.getProductName());
            }
      }
}

+ Library
cglib.jar
common-collection.jar
ehcache.jar
dom4j.jar
jta.jar
hibernate3.jar
mysql-connector.jar
antlr-2.7.5H3.jar

Chú ý: copy tất cả thư mục con của thư mục classes trong thư mục target vào C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\axis2\WEB-INF\classes

Tip
+ Lỗi java.lang.IllegalStateException: No valid ObjectCreator found <= thiếu stax-1.2.0.jar file
+ Có thể sử dụng eclipse plugin để phát sinh WSDL file: http://ws.apache.org/axis2/tools/index.html
+ SOAP: nghi thức trao đổi thông tin qua HTTP, SOAP message là XML message
+ JAX-WS là kỹ thuật để xây dựng web service và client giao tiếp qua XML
+ JAX-RPC cung cấp mô hình để phát triển ứng dụng dựa vào SOAP. Lập trình JAX-RPC đơn giản kỹ thuật chạy nghi thức SOAP và cung cấp ánh xạ services giữa Java và WSDL
+ WSDL: file mô tả web service
+ Sử dụng tool java2wsdl để phát sinh wsdl file: java2wsdl -cp . -cn org.sample.service.BusinessService -of BusinessService.wsdl
+ POJO nhấn mạnh đối tượng là đối tượng Java bình thường (hông phải Enterprise JavaBean, nó không cài đặt, kế thừa bất kỳ lớp nào hoặc chứa annotation) để thiết kế đơn giản hơn, tốt hơn. JavaBean là một POJO có tính chất serializable (cho phép truy cập các thuộc tính private của các đối tượng persistent), có phương thức khởi tạo không tham số, cho phép truy cập các thuộc tính bằng phương thức getter và setter.
(Spring POJO: http://www.onjava.com/pub/a/onjava/2005/06/29/spring-ejb3.html).

Chúc bạn thành công.
DangTrung

Không có nhận xét nào:

Đăng nhận xét