在spring web项目中使用Apache CXF框架发布webservice服务

董砚
2023-12-01

场景: 使用Apache CXF发布一个查询城市信息的服务,
      查到信息是服务端写的一个JSON格式的静态数据,使用webservice的最简流程。

1.创建spring web项目,且确保web项目在Tomcat中能正常启动。
  讲解:本例的项目名称是study,包名是 com.zbz.webservice
  
2.正确导入Apache CXF框架的jar包,本例使用的3.1.14版本

3.创建一个接口,本例只用一个方法.在com.zbz.webservice包下创建。
  @WebService(targetNamespace = "http://webservice.zbz.com/")
  public interface PublicInterface {
    /**获取城市信息的方法,入参是城市名称*/
    String getCityInfo(String name);
}
   讲解:@WebService是一个发布webservice的注解
        targetNamespace = "http://webservice.zbz.com/" 指定名称空间
        名称空间是包名反过来。
4.创建一个类实现接口
   在com.zbz.webservice.impl包下创建PublicInterfaceImpl实现类,
   并且实现String getCityInfo(String name)方法

5.本例使用一个独立的webserviceConfig.xml文件作为配置文件,只配置Apache CXF相关信息。
  存放目录: /study/WebRoot/WEB-INF/config/webservice/webserviceConfig.xml
  <1>.在配置文件中配置PublicInterfaceImpl实现类的bean
  <bean id="publicInterface" class="com.zbz.webservice.impl.PublicInterfaceImpl" />
  <2>.通过jaxws:server方式来配置webservice
  <jaxws:server serviceClass="com.zbz.webservice.PublicInterface" address="/publicService">
        <jaxws:serviceBean>
            <ref bean="publicInterface" />
        </jaxws:serviceBean>
  </jaxws:server>
  讲解:com.zbz.webservice.PublicInterface是接口名
       /publicService对外的访问地址要用
       <ref bean="publicInterface" />就是实现类的bean
    
6.在web.xml文件中引入webserviceConfig.xml 
  <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/config/common/*.xml;/WEB-INF/config/webservice/*.xml</param-value>
  </context-param>
  讲解:/WEB-INF/config/common/*.xml;其它spring的配置
       /WEB-INF/config/webservice/*.xml 就是Apache CXF
7.在web.xml文件中发布一个Apache CXF 的CXFServlet服务
    <servlet>
        <servlet-name>CXFServlet</servlet-name>
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CXFServlet</servlet-name>
        <url-pattern>/ws/*</url-pattern>
    </servlet-mapping>
    讲解:这个一个常规servlet是一样的配置,只是需要引入的是Apache CXF框架中的一个jar包内的类。
         <url-pattern>/ws/*</url-pattern> ,这是作为外部访问是的路径映射,即CXFServlet的服务都映射
         在/ws/* 下。

8.访问路径: http://127.0.0.1:8080/study/ws/publicService?wsdl
   讲解: http://127.0.0.1:8080 IP+端口
         study 项目名称
         /ws在web.xml中的配置映射路径
         /publicService 在webserviceConfig.xml中的地址
         wsdl  标准后缀
9.可以使用Storm这样的第三方工具测试,当然也可以自己用代码实现客户端。

10.上文提到类与配置文件

1>.接口

package com.zbz.webservice;
import javax.jws.WebService;

/**
 * 对外发布服务接口,只需是一个普通java接口即可
 * @ClassName: PublicInterface
 * @date: 2018-12-29 下午8:34:46
 */
@WebService(targetNamespace = "http://webservice.zbz.com/")
public interface PublicInterface {
	/**获取城市信息的方法,入参是城市名称*/
	String getCityInfo(String name);
}

2>实现类

package com.zbz.webservice.impl;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.zbz.webservice.PublicInterface;
/**
 * 实现接口方法
 * @ClassName: PublicInterfaceImpl
 * @date: 2018-12-29 下午8:35:14
 */
public class PublicInterfaceImpl implements PublicInterface {
	private static final Logger logger = LoggerFactory.getLogger(PublicInterfaceImpl.class);
	@Override
	public String getCityInfo(String name) {
		/**1.入参简单判断*/
		if(StringUtils.isBlank(name) || name == null){
			return "传入参数不正确,请确认.";
		}
		String rtnMes = "本服务暂时不支持其它城市查询.";
		/**2.具体逻辑,本例仅仅做个简单返回demo,传入参数是厦门,则返回厦门信息*/
		if("厦门".equals(name)){
			/**获取回厦门信息*/
			rtnMes = getCityDetailXiamen();
		}
		return rtnMes;
	}
    
	public static  String getCityDetailXiamen(){
		String city = "{\n" +
                "    \"CITY_NAME\": \"厦门\", \n" +
                "    \"LAND_AREA\": 1699.39, \n" +
                "    \"POPULATION\": 401, \n" +
                "    \"GROSS\": 0, \n" +
                "    \"AREA_NUMBER\": \"350200\", \n" +
                "    \"POSTAL_CODE\": \"361000\", \n" +
                "    \"TELEPHONE_CODE\": \"0592\", \n" +
                "    \"CAR_CODE\": \"闽D\", \n" +
                "    \"DESCRIBE\": \"适合居住的城市.\"\n" +
                "}";
		return city;
	}
}

3.webserviceConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:jaxws="http://cxf.apache.org/jaxws" 
	xmlns:jaws="http://cxf.apache.org/jaxws" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans    
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd    
        http://www.springframework.org/schema/context    
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd    
        http://cxf.apache.org/jaxws
        http://cxf.apache.org/schemas/jaxws.xsd 
        http://cxf.apache.org/transports/http/configuration 
        http://cxf.apache.org/schemas/configuration/http-conf.xsd" >

	<bean id="publicInterface" class="com.zbz.webservice.impl.PublicInterfaceImpl" />
	<!-- 通过jaxws:server方式来配置webservice -->
	<jaxws:server serviceClass="com.zbz.webservice.PublicInterface" address="/publicService">
		<jaxws:serviceBean>
			<ref bean="publicInterface" />
		</jaxws:serviceBean>
	</jaxws:server>
</beans>

4.web.xml部分

<!-- 加载spring配置文件 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/config/common/*.xml;/WEB-INF/config/webservice/*.xml</param-value>
	</context-param>
	
	<!-- CXF方式发布webservice服务start -->
	<servlet>
        <servlet-name>CXFServlet</servlet-name>
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CXFServlet</servlet-name>
        <url-pattern>/ws/*</url-pattern>
    </servlet-mapping>
	<!-- CXF方式发布webservice服务end -->

以上,TKS.

 类似资料: