2014年9月23日 星期二

WebService using JAX-RPC style with Spring & Axis 1

Web Service 使用 RPC-style 的方式,只剩很古早的 Axis 1 (最後版本為 1.4) 還支援。
如果需要產生此種 style 的 Web Service , 可參考以下方法 (參考 Pro Spring 作法)。

1. 建立 maven project

2. 加上 dependency

         <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>commons-discovery</groupId>
            <artifactId>commons-discovery</artifactId>
            <version>0.4</version>
        </dependency>
        <dependency>
            <groupId>org.apache.axis</groupId>
            <artifactId>axis-jaxrpc</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>org.apache.axis</groupId>
            <artifactId>axis</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>org.apache.axis</groupId>
            <artifactId>axis-saaj</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>wsdl4j</groupId>
            <artifactId>wsdl4j</artifactId>
            <version>1.6.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>2.5.6</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>2.5.6</version>
        </dependency>
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib-nodep</artifactId>
            <version>2.2</version>
        </dependency>




3. 產生 interface

package org.ws;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface RemoteHelloWorld extends Remote {
 String getMessage() throws RemoteException;
}
4. 產生 implement class

package org.ws.impl;

import java.rmi.RemoteException;

import org.springframework.remoting.jaxrpc.ServletEndpointSupport;
import org.ws.RemoteHelloWorld;


public class JaxRpcHelloWorld extends ServletEndpointSupport implements RemoteHelloWorld {
    
 public String getMessage() throws RemoteException {
  
  return "Hello World";
 }

} 
5. 在 WEB-INF 下新增 server-config.wsdd 檔案 (Axis 使用)

<deployment xmlns="http://xml.apache.org/axis/wsdd/"
 xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
 <handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper" />
 <service name="HelloWorld" provider="java:RPC">
  <parameter name="className" value="org.ws.impl.JaxRpcHelloWorld" />
  <parameter name="allowedMethods" value="*" />
 </service>
 <transport name="http">
  <requestFlow>
   <handler type="URLMapper" />
  </requestFlow>
 </transport>
</deployment>
6. 修改 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

 <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath*:ApplicationContext.xml</param-value>
 </context-param>
 
 <servlet>
  <servlet-name>context</servlet-name>
                <servlet-class>
                     org.springframework.web.context.ContextLoaderServlet
                </servlet-class>
                <load-on-startup>1</load-on-startup>
 </servlet>
 
 <servlet>
                <servlet-name>axis</servlet-name>
                <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
                <load-on-startup>2</load-on-startup>
        </servlet>

        <servlet-mapping>
         <servlet-name>axis</servlet-name>
                <url-pattern>/services/*</url-pattern>
        </servlet-mapping>

</web-app>
7. 開 server 看 wsdl
http://localhost:8080/xxxxxx/services/HelloWorld?wsdl