6.用CXF编写基于Spring的WebService

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了6.用CXF编写基于Spring的WebService相关的知识,希望对你有一定的参考价值。

首先是服务器端:

//实体类
public class Weather {

    private String region;//区域编码
    private String regionName;//区域名称
    private float temperature;//温度
    private boolean isRain;//是否下雨

    public Weather() {
        super();
    }
    public Weather(String region, String regionName, float temperature,
            boolean isRain) {
        super();
        this.region = region;
        this.regionName = regionName;
        this.temperature = temperature;
        this.isRain = isRain;
    }
    
    public String getRegion() {
        return region;
    }
    public void setRegion(String region) {
        this.region = region;
    }
    public String getRegionName() {
        return regionName;
    }
    public void setRegionName(String regionName) {
        this.regionName = regionName;
    }
    public float getTemperature() {
        return temperature;
    }
    public void setTemperature(float temperature) {
        this.temperature = temperature;
    }
    public boolean isRain() {
        return isRain;
    }
    public void setRain(boolean isRain) {
        this.isRain = isRain;
    }
    
    @Override
    public String toString() {
        return "Weather [region=" + region + ", regionName=" + regionName
                + ", temperature=" + temperature + ", isRain=" + isRain + "]";
    }
}
//SEI
@WebService
public interface WeatherDao {

    //通过区域编码查找该地区天气情况
    @WebMethod
    Weather findWeatherByRegion(String region);
}
//SEI实现类
@WebService
public class WeatherService implements WeatherDao {

    @Override
    public Weather findWeatherByRegion(String region) {
        return new Weather("fjxm", "福建省厦门市", 20, true);
    }

}
//配置beans.xml
<?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">
    
    <!-- cxf的一些核心配置(必须引入) -->
    <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" />
    
    <!-- implementor:SEI实现类全类名 -->
    <!-- 
        address:名字可以任意取;
        webService部署路径:主机名/工程名/address
        wsdl文档:通过主机名/工程名/address?wsdl
        不再需要手动去发布webService!
    -->
    <jaxws:endpoint id="weatherWS" 
        implementor="com.cxf.service.WeatherService"
        address="/weatherws" />
</beans>
//配置web.xml,spring文件随容器启动加载
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>cxf_spring_webService_server</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <!-- 配置beans.xml -->
  <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:beans.xml</param-value>
  </context-param>
  <listener>
      <listener-class>
          org.springframework.web.context.ContextLoaderListener
      </listener-class>
  </listener>
  <servlet>
      <servlet-name>CXFServlet</servlet-name>
    <display-name>CXF Servlet</display-name>
    <servlet-class>
        org.apache.cxf.transport.servlet.CXFServlet
    </servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
        <servlet-name>CXFServlet</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
</web-app>
//发布该工程,查看wsdl文档:

<?xml version=‘1.0‘ encoding=‘UTF-8‘?><wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://service.cxf.com/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns2="http://schemas.xmlsoap.org/soap/http" xmlns:ns1="http://dao.cxf.com/" name="WeatherServiceService" targetNamespace="http://service.cxf.com/">
  <wsdl:import location="http://localhost:8080/cxf_spring_webService_server/weatherws?wsdl=WeatherDao.wsdl" namespace="http://dao.cxf.com/">
    </wsdl:import>
  <wsdl:binding name="WeatherServiceServiceSoapBinding" type="ns1:WeatherDao">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="findWeatherByRegion">
      <soap:operation soapAction="" style="document"/>
      <wsdl:input name="findWeatherByRegion">
        <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output name="findWeatherByRegionResponse">
        <soap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="WeatherServiceService">
    <wsdl:port binding="tns:WeatherServiceServiceSoapBinding" name="WeatherServicePort">
      <soap:address location="http://localhost:8080/cxf_spring_webService_server/weatherws"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

************至此,服务器端发布成功,接下来是客户端生成代码以及配置和测试****************

//配置客户端的client-beans.xml
<?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">
    
    <!-- serviceClass:SEI -->
    <!-- address:server端webService的发布地址 -->
    <jaxws:client id="weatherClient" 
        serviceClass="com.cxf.dao.WeatherDao" 
        address="http://localhost:8080/cxf_spring_webService_server/weatherws" />
</beans>
//生成客户端代码同cxf生成客户端代码步骤---略
//测试
public class Test {

    public static void main(String[] args) {
        //获取spring容器,自动创建WeatherDao实现类对象
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("client-beans.xml");
        
        //client-beans.xml里的id
        WeatherDao weatherDao = (WeatherDao) context.getBean("weatherClient");
        Weather weather = weatherDao.findWeatherByRegion("fjxm");
        System.out.println(weather);
    }
}

执行结果:

Weather [rain=true, region=fjxm, regionName=福建省厦门市, temperature=20.0]

 

以上是关于6.用CXF编写基于Spring的WebService的主要内容,如果未能解决你的问题,请参考以下文章

CXF+Spring+Tomcat 案例

用CXF发布Web服务

了解CXF、Spring、JAXWS等的架构或关系

CXF+Spring+Eclipse简明示例

WebService—CXF整合Spring实现接口发布和调用过程

WebService—CXF整合Spring实现接口发布和调用过程2