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

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

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

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

测试结果:

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西瓜不甜柠檬不酸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值