700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > SpringBoot整合CXF框架实现Webservice服务端

SpringBoot整合CXF框架实现Webservice服务端

时间:2018-08-15 04:56:51

相关推荐

SpringBoot整合CXF框架实现Webservice服务端

1、前言

近期接手一个10多年的老项目,敲重点,10多年!!!就是最纯粹的servlet技术,貌似是从运维到现在,老项目终究会有被淘汰的这一天,这不,到我接手的时候,我就是那接手的最后一个人,由我来开发数据迁移接口,通过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;@Configurationpublic class WebServiceConfig {@Autowiredprivate TestService service;@Autowiredprivate 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*/@Beanpublic 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 = "") // 命名空间自定义,一般都是包名反写@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)public interface TestService {@WebMethodString getMessage(@WebParam(name="name") String name);@WebMethod@WebResult(name="user", targetNamespace="", 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 = "", endpointInterface = "com.chen.webservice.TestService")public class TestServiceImpl implements TestService {@Overridepublic String getMessage(String name) {return "Hello ! "+name;}@Overridepublic 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;@XmlRootElementpublic 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

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

测试结果:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。