Apache CXF学习-建立基于spring的web service

引入:java

咱们上述例子展现了如何从java code开始来开发一个基于jaxws的web service并使其对外服务,可是咱们建立web service的过程,其实并非由spring来完成的,咱们这里讲展现如何利用spring配置文件来完成这件事情。web


实践:spring

其实很简单,只要稍做修改就能够了。apache


首先,在web.xml中,咱们定义一个spring的应用上下文文件(反正我不太喜欢它默认的applicationContext.xml,由于咱们本身起有意义的名字会让应用更加有可控制性而且提升可读性),而且被ContextLoader所载入,为了节省篇幅,咱们只贴代码片段了,你们都知道放在哪里。app


<!-- 这里演示cxf怎么和Spring容器集成,从而利用Spring的配置文件来管理发布的web service -->
    <!-- BEGIN SPRING BEAN CONFIGURATION-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>WEB-INF/beans.xml</param-value>
    </context-param>
                                                                                                                                                                                                                                                                                                                                                                                                                                         
    <listener>
        <listener-class>
        org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>
    <!-- END SPRING BEAN CONFIGURATION -->
                                                                                                                                                                                                                                                                                                                                                                                                                                        


因此咱们必须在WEB-INF/beans.xml中定义一个bean的配置文件,其实大致上和咱们上文中的cxf-servlet.xml差很少,只不过咱们要导入一些spring配置:maven

<?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中的spring的一些配置文件,他们都在cxf-<version>.jar文件中 -->
<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" />
<jaxws:endpoint
id="calcService"
implementor="com.charles.cxfstudy.server.services.CalcServiceImpl"
address="/calc" />
</beans>


从这里能够看出,显著的不一样在于,咱们用<import>元素导入了3个配置文件,他们都和spring相关,他们中定义的bean才会负责建立和管理web service,这些配置文件都在类路径下的 cxf-<version>.jar的jar包中。ide

而后咱们在下面就能够定义咱们的要建立的web service的endpoint了,这里咱们用<endpoint>元素来给定要建立的webservice是用具体的什么实现类来建立的,而且绑定到什么路径上,最后赋予一个被bean容器引用的id.url


由于在上面配置文件中咱们定义了一个CalcServiceImpl,因此咱们必须为其写一个服务接口和服务实现类:spa


服务接口以下,为了简单起见,咱们计算服务只提供2个整数的相加运算:code

/**
 * 这是一个web服务接口定义,假设这里定义了一个计算服务,而且简单起见只有加法与水暖
 */
package com.charles.cxfstudy.server.services;
import javax.jws.WebParam;
import javax.jws.WebService;
/**
 * @author charles.wang
 *
 */
@WebService
public interface ICalcService {
                                                                                                                                                                                                                                                                   
    /**
     * 计算两个整数类型的和
     * @param val1   第一个运算子
     * @param val2   第二个运算子
     * @return     和
     */
    int calcSum (@WebParam(name="a")int val1,@WebParam(name="b")int val2);
}

这里我第一次使用了@WebParam的注解,这个目的是为了告诉CXF引擎在生成对应的wsdl文件时候,不要把这些参数映射到参数名val1,val2上,而是映射到这里我用name属性指定的a和b上。


而后就定义一个服务实现类,和之前彻底同样:

/**
 * 服务实现类,提供计算服务
 */
package com.charles.cxfstudy.server.services;
import javax.jws.WebService;
/**
 * @author charles.wang
 *
 */
@WebService(endpointInterface="com.charles.cxfstudy.server.services.ICalcService")
public class CalcServiceImpl implements ICalcService {
    /**
     * 计算两个整数类型的和
     * @param val1   第一个运算子
     * @param val2   第二个运算子
     * @return     和
     */
    @Override
    public int calcSum(int val1, int val2) {
        return val1+val2;
    }
}


如今就大功告成了,咱们用maven构建成二进制war包而后部署到容器中:

wKiom1MFydCCU636AAinmnawPOc998.jpg

为了对比咱们这个实验和上面实验,我吧2种方式同时放在一个工程下,如图 /calc的服务发布过程咱们采用了spring的机制,而上文实验的/greeting咱们没有采用spring,而是用原生的JAX-WS来负责发布,咱们仍是能够清晰的看到这2个过程是有区别的


最后发布成功,咱们经过url   http://localhost:8080/cxf_jaxws_server/services/calc?wsdl 来访问对应的web服务:

wKioL1MFylqRztK-AAkDIvOZt7w427.jpg


事实证实,这是正确的,若是细心点,还能够发现,咱们这里的方法"calcSum"定义的参数列表( 位于 <xs:complexType name="calcSum">中,参数名字是a和b而不是val1,val2,这代表咱们在服务接口定义中的@WebParam的设定生效了。

相关文章
相关标签/搜索