1. 程式人生 > >EJB3 釋出WebService及客戶端呼叫

EJB3 釋出WebService及客戶端呼叫

    EJB3釋出WebService很簡單,但是在客戶端呼叫上卻遇到了太多的問題,差不多一天的時間終於搞定了,下面是整個過程,我的伺服器採用Weblogic10.3

釋出WebService

    /**

     * @author 王碩

     **/

    @WebService

    @SOAPBinding(style=SOAPBinding.Style.DOCUMENT)

    public interface WS {

        public int sum(int x, int y);

    }

    /**

     * @author 王碩

     **/

    @Stateless

    @WebService(serviceName="WSService")

    public class WSImpl implements WS {

        @WebMethod

        public int sum(int x, int y) {

            return x + y;

        }

    }

部署到Weblogic上,WebService就釋出成功了,可以檢視WL Console, 也可以直接訪問http://localhost:7001/WSImpl/WSService?wsdl檢視是否成功,這裡需要注意的是,WS上的@WebService是必須要有的,因為最後這個介面是要被打成jar供呼叫Service的客戶端使用的,如果沒有這個註解的話,Container是無法識別他為一個Service Interface的, 我這裡是將session bean作為服務釋出的,這樣做的好處不少書籍中都介紹了,我這裡就不多說了,下面就客戶端的呼叫,我這裡建立了一個新的project,過程如下:

    /**

     * 負責呼叫WS的Client

     * @author 王碩

     **/

    @WebServiceClient(wsdlLocation="http://localhost:7001/WSImpl/WSService?wsdl")

    public class WSProxy extends Service {

        public WSProxy(URL wsdlDocumentLocation, QName serviceName) {

          super(wsdlDocumentLocation, serviceName); 

        }

        public int proxySum() {

          int result = 0;

          WS ws = this.getPort(WS.class);

          result = ws.sum(1, 1);

          return result;

        }       

    }

    /**

     * @author 王碩

     **/

    @Local

    public interface WSInvoke {

        public int sum();

    }

    /**

     * @author 王碩

     **/

    @Stateless

    public class WSInvokeImpl implements WSInvoke {

      @WebServiceRef

      private WSProxy proxy;

      public int sum() {

        return proxy.proxySum();

      }

      public void setProxy(WSProxy proxy) {

        this.proxy = proxy;

      }

      public WSProxy getProxy() {

        return proxy;

      }

    }

將這個session bean注入servlet就可以訪問了,這裡需要注意的是WS這個介面,這個介面是釋出WebService時對應的Service Interface,呼叫Service的應用一般是獨立的應用,當然不會有這個WS,通常如果釋出WebService,也會提供相應的Service Interface讓你下載加入到自己的應用中,而我們這裡只是測試一下,不用那麼麻煩,所以可以建立一個與釋出時一模一樣的WS介面來做測試,但是在建立的時候請注意,這裡WS的package必須和釋出時的WS的package一致,因為釋出時我這裡只用了最簡單的配置,沒有指定發現空間,所以預設採用的是對應的package,所以這裡如果是自己建立WS的話,package必須一致,這樣Container會根據其package到相應的釋出空間查詢對應的服務,通常是相應的釋出者把對應的Service Interface打成jar供大家下載,加入到自己的應用中,所以package肯定是一致的,所以這裡大家還是要注意一些的,以上就是EJB3 釋出與呼叫WebServicer的整個過程了,希望對大家有幫助,當然方式肯定不是隻有這一種,歡迎大家一起交流.