天天看點

Web環境使用相對路徑釋出Webservice

Web環境使用相對路徑釋出Webservice

         通常我們的Webservice服務的釋出位址都将是一個相對路徑,在與Spring一起使用時我們需要引入Cxf配置Webservice的schema,如jaxws,用以定義對應的Webservice。

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

      xmlns:jaxws="http://cxf.apache.org/jaxws"

      xsi:schemaLocation="

         http://www.springframework.org/schema/beans

         http://www.springframework.org/schema/beans/spring-beans.xsd

         http://cxf.apache.org/jaxws

         http://cxf.apache.org/schemas/jaxws.xsd">

   <bean id="helloWorld" class="com.elim.test.cxf.service.HelloWorldServiceImpl"/>

   <!-- ID可以加斜杠也可以不加 -->

   <jaxws:server id="/helloWorld" serviceBean="#helloWorld" serviceClass="com.elim.test.cxf.service.HelloWorldService" />

</beans>

         然後我們需要定義一個CXFServlet,用以接收對應的Webservice請求,如下所示。

<web-app 

        version="3.0" 

        xmlns="http://java.sun.com/xml/ns/javaee" 

        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

   <context-param>

      <param-name>contextConfigLocation</param-name>

      <param-value>classpath:webservices.xml</param-value>

   </context-param>

   <listener>

   <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

   </listener>

   <servlet>

      <servlet-name>CxfServlet</servlet-name>

      <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>

   </servlet>

   <servlet-mapping>

      <url-pattern>/sys/service/*</url-pattern>

   </servlet-mapping>

</web-app>

         這樣如果我們想通路HelloWorldService這個Webservice就可以通過相對于目前工程釋出路徑的/sys/service/helloWorld來通路了。

         但是如果我們的工程沒有使用Spring,但是我們也想把Webservice釋出為工程的某一個路徑的相對路徑怎麼辦?Cxf也為我們提供了相應的支援,這比使用Spring時的CXFServlet要麻煩一點。Cxf為我們提供了一個CXFNonSpringServlet,這要求我們實作自己的繼承自CXFNonSpringServlet的Servlet,然後重寫其loadBus方法,最終需要達到的效果就是CXFNonSpringServlet使用的Bus與我們的釋出Webservice時使用的Bus是同一個即可。這樣當我們通路CXFNonSpringServlet請求某個Webservice時,CXFNonSpringServlet将自動根據請求的相對路徑去尋找釋出路徑為其相對路徑的Webservice。

publicclass WebserviceServlet extends CXFNonSpringServlet {

   /**

    *

    */

   private static final longserialVersionUID = 3919868434043901738L;

   @Override

   protected void loadBus(ServletConfig sc) {

      super.loadBus(sc);

      //擷取目前CXFNonSpringServlet使用的Bus,然後利用該Bus來釋出服務

      Bus bus = this.getBus();

      JaxWsServerFactoryBean jsFactoryBean = new JaxWsServerFactoryBean();

      jsFactoryBean.setBus(bus);

      //該路徑是相對于目前CXFNonSpringServlet比對的路徑的,也可以加斜杠

      jsFactoryBean.setAddress("helloWorld");

      jsFactoryBean.setServiceClass(HelloWorldService.class);

      jsFactoryBean.setServiceBean(new HelloWorldServiceImpl());

      jsFactoryBean.create();

   }

}

   這時我們的web.xml需要定義我們自己的CXFNonSpringServlet,即:

      <servlet-class>com.elim.test.cxf.servlet.WebserviceServlet</servlet-class>

      <load-on-startup>1</load-on-startup>

參考文檔

<a href="http://cxf.apache.org/docs/servlet-transport.html">http://cxf.apache.org/docs/servlet-transport.html</a>

(注:本文是基于Cxf2.7.6所寫)