本文所用WebService基于maven-ssm-cxf,此处暂时仅使用做记录,后期看心情适当整理相关知识点。
首先pom.xml添加cxf的相关依赖,此处贴出的仅是cxf的相关依赖。
<properties>
<cxf.version>3.1.8</cxf.version>
</properties>
<!--cxf-->
<!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-frontend-jaxws -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>${cxf.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-core -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-core</artifactId>
<version>${cxf.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-transports-http -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>${cxf.version}</version>
</dependency>
接着我们需要配置一个CXF的servlet:
<!--定义一个cxf的servlet-->
<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>/webservice/*</url-pattern>
</servlet-mapping>
接下来是最重要的一部,用Spring整合CXF:
在这之前新建一个CXF的包(至于如何命名,就看你心情了),如下图:
这里有两个主要类
其中就只定义了一个简单的say()
方法。
package cn.wind.WebServiceE.webServices;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
/**
* Created by wind on 2016/11/15.
*/
@WebService(targetNamespace = "webServices.WebServiceE.wind.cn")
public interface IHelloSevice {
@WebResult(name="Resultstr")
public String say(@WebParam(name="str" )String str,@WebParam(name="AA" )int a);
}
这里就是对say()
方法的简单实现。
package cn.wind.WebServiceE.webServices.impl;
import cn.wind.WebServiceE.webServices.IHelloSevice;
import org.springframework.stereotype.Component;
import javax.jws.WebService;
/**
* Created by wind on 2016/11/15.
*/
@Component("HelloWord")
@WebService(targetNamespace = "webServices.WebServiceE.wind.cn")
public class HelloserServiceImpl implements IHelloSevice{
@Override
public String say(String str,int a ) {
System.out.print("This is "+str);
return "Hello "+str;
}
}
接下来就是整合Spring了,由于需要使用到CXF的标签,所以我们需要添加额外的命名路径如下:
为了方便扩展,单独写了一个cxf配置文档,通过将如下代码放入spring.xml(Spring配置文档)中即可,具体路径需根据自己的实际情况做相应更改。
<import resource="classpath:conf/spring-cxf.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"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
">
<import resource="classpath:META-INF/cxf/cxf.xml"/>
<import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
<!-- 自动扫描webService -->
<context:component-scan base-package="cn.wind.WebServiceE.webServices" />
<!-- 定义webservice的发布接口 -->
<jaxws:endpoint
implementor="#HelloWord"
address="/HelloWorld"></jaxws:endpoint>
</beans>
#helloWorld
指的是我们在HelloWorldImpl
类中所自定义的名字,/HelloWorld
则是我们需要访问的地址。
附:此处所用文档目录如图:
之后我们运行项目输入该地址:http://localhost:8080/webservice/HelloWorld?wsdl如果出现如下界面:
最初由于没有在接口和实现类的@WebService后面添加 targetNamespace属性,导致红框部分的具体的参数没有被wsdl描述,只是放了一句 <soap:body use="literal"/> ,让人摸不着头脑。之后添加后,但是该属性使用正向命名(即:cn.wind.WebServiceE.webServices)时,后期客户端导出使用时相应java文件头部信息为
package webServices.WebServiceE.wind.cn
故之后,服务器端反向设置(即 :@WebService(targetNamespace = "webServices.WebServiceE.wind.cn")),后期客服端导出时将变为正向的
package cn.wind.WebServiceE.webServices
注:后来看资料,说targetNamespace“是服务端的包结构,不要暴露出去!”,故很多教程中这个属性都是用的网址,本文此处为了与后面的客户端部分简单统一,偷了点懒,暂时暴露就暴露吧。