
1、前言
近期接手一个10多年的老项目,敲重点,10多年!!!就是最纯粹的servlet技术,貌似是从2008年运维到现在,老项目终究会有被淘汰的这一天,这不,到我接手的时候,我就是那接手的最后一个人,由我来开发数据迁移接口,通过Webservice接口调用的方式,把数据传输到新系统。没办法,只能忍住寂寞好好研究这坨代码。说来也是奇葩,这坨代码在一几年的时候,居然引入了Spring,导致这坨代码无敌臃肿,servlet和Spring共存,本身还引入了很古老的EJB框架,我直接当场头大。踩完了一个一个坑之后,终于开发进度到了尾声,趁着手上还算热乎记录一下。
为了顺应新技术的潮流,此次我使用SpringBoot整合CXF来实现Webservice服务端。
2、引入依赖
创建SpringBoot项目,引入CXF所需依赖,CXF属于轻量级的框架,我觉得就算放到现在,也是一个值得选型的框架,比较简单暴力。
可以看到我使用<exclusions>标签排除掉了javax.validation,如果不加这个,运行的时候就会直接报错,网上有很多文章没有加上这一步,我就很好奇他们都是怎么运行成功的!!!
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
<version>3.2.7</version>
<exclusions>
<exclusion>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.3.3</version>
</dependency>
3、配置WebService
WebService其实就是http+XML,现在基本都是使用http或https返回json数据这种方式,但WebService是返回XML报文。
package com.chen.config;
import org.apache.cxf.Bus;
import org.apache.cxf.bus.spring.SpringBus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.transport.servlet.CXFServlet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.chen.webservice.TestService;
import javax.xml.ws.Endpoint;
@Configuration
public class WebServiceConfig {
@Autowired
private TestService service;
@Autowired
private Bus bus;
@Bean(name=Bus.DEFAULT_BUS_ID)
public SpringBus springBus(){
return new SpringBus();
}
/**
* 设置Webservice接口访问前缀
* @return
*/
@Bean(name= "cxfServlet")
public ServletRegistrationBean dispatcherServlet(){
return new ServletRegistrationBean(new CXFServlet(),"/app/*");
}
/**
* 将Webservice接口进行暴露
* 访问路径:ip+端口+/app+/webservice
* @return
*/
@Bean
public Endpoint endpointHelloService(){
EndpointImpl endpoint=new EndpointImpl(bus,service);
endpoint.publish("/webservice");
return endpoint;
}
}
4、创建WebService接口
我这里就写两个简单的小接口,一个返回字符串,一个返回对象。
package com.chen.webservice;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import com.chen.entity.User;
@WebService(targetNamespace = "http://webservice.chen.com") // 命名空间自定义,一般都是包名反写
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
public interface TestService {
@WebMethod
String getMessage(@WebParam(name="name") String name);
@WebMethod
@WebResult(name="user", targetNamespace="http://webservice.chen.com", partName="user")
User getUser();
}
5、创建WebService实现类
package com.chen.webservice;
import org.springframework.stereotype.Service;
import com.chen.entity.User;
import javax.jws.WebService;
//serviceName:要发布的服务名,targetNamespace:命名空间,一般为包名倒序,endpointInterface:接口路径
@Service
@WebService(serviceName = "TestService",targetNamespace = "http://webservice.chen.com", endpointInterface = "com.chen.webservice.TestService")
public class TestServiceImpl implements TestService {
@Override
public String getMessage(String name) {
return "Hello ! "+name;
}
@Override
public User getUser() {
User user = new User();
user.setName("小明");
user.setAge("20");
user.setSex("男");
return user;
}
}
6、用到的实体类User
注意@XmlRootElement注解,使用这个注解才能将对象对射成xml格式。
对了,在开发过程中,遇到了一个比较头疼的问题,如果返回的对象里面嵌套了Object对象的话,那么还需要在类上面加入@XmlSeeAlso({Info.class})注解(将Info改成对应的类),否则会出现难以解决的错误。比如,User类里面有一个属性,为private Object info,最后的时候要set进去一个Info对象,那么就应该在User对象上面添加@XmlSeeAlso({Info.class})。这个解决办法还是我在国外的论坛上面找到的,国内网站居然没找到解决办法,希望我这个解决办法能对你有所帮助。
package com.chen.entity;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class User {
private String name;
private String age;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
7、测试
关于测试我这里就使用工具进行调用了,推荐使用SoapUI这个软件。
点击“File”--“New SOAP Project”

输入 localhost:8080/app/webservice?wsdl

完成后便会自动显示接口方法名称

测试结果:


本文介绍如何使用SpringBoot结合CXF框架搭建Webservice服务端,包括配置依赖、创建接口及其实现类,并通过SoapUI进行测试验证。
442

被折叠的 条评论
为什么被折叠?



