Spring boot 整合CXF开发web service示例

2025-05-29 0 27

前言

说起web service最近几年restful大行其道,大有取代传统soap web service的趋势,但是一些特有或相对老旧的系统依然使用了传统的soap web service,例如银行、航空公司的机票查询接口等。

目前就遇到了这种情况,需要在系统中查询第三方提供的soap web service接口,也就是说要将它整合进现有的系统当中。

spring整合CXF本来十分简单,但是因为使用了Spring boot,不想用以前xml一堆配置的方式,那么能否按照Spring boot的风格优雅的进行整合呢?

答案当然是肯定的,但是遍查网上几乎没有这方面的资料,折腾过后觉得还是有必要记录一下,虽然它显得非常的简单。

添加依赖

Maven的项目,首先当然是添加依赖了,除了原先Spring boot的依赖之外,还需要添加cxf依赖:

?

1

2

3

4

5

6

7

8

9

10
<dependency>

<groupId>org.apache.cxf</groupId>

<artifactId>cxf-rt-frontend-jaxws</artifactId>

<version>3.1.6</version>

</dependency>

<dependency>

<groupId>org.apache.cxf</groupId>

<artifactId>cxf-rt-transports-http</artifactId>

<version>3.1.6</version>

</dependency>

编写业务代码

这里我们以查询用户信息为例,创建一个自定义的User对象:

?

1

2

3

4

5

6

7

8
public class User implements Serializable {

private static final long serialVersionUID = -5939599230753662529L;

private Long userId;

private String username;

private String email;

private Date gmtCreate;

//getter setter ......

}

接下来创建一个用于提供web service服务的用户接口,共两个方法getNamegetUser,一个返回普通的String,一个返回自定义对象:

?

1

2

3

4

5

6

7
@WebService

public interface UserService {

@WebMethod

String getName(@WebParam(name = "userId") Long userId);

@WebMethod

User getUser(Long userId);

}

有接口当然要有业务代码实现了,这里我们只做简单的演示:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31
public class UserServiceImpl implements UserService {

private Map<Long, User> userMap = new HashMap<Long, User>();

public UserServiceImpl() {

User user = new User();

user.setUserId(10001L);

user.setUsername("liyd1");

user.setEmail("liyd1@qq.com");

user.setGmtCreate(new Date());

userMap.put(user.getUserId(), user);

user = new User();

user.setUserId(10002L);

user.setUsername("liyd2");

user.setEmail("liyd2@qq.com");

user.setGmtCreate(new Date());

userMap.put(user.getUserId(), user);

user = new User();

user.setUserId(10003L);

user.setUsername("liyd3");

user.setEmail("liyd3@qq.com");

user.setGmtCreate(new Date());

userMap.put(user.getUserId(), user);

}

@Override

public String getName(Long userId) {

return "liyd-" + userId;

}

@Override

public User getUser(Long userId) {

return userMap.get(userId);

}

}

发布服务

接口和业务代码我们都写完了,剩下的就是发布服务了,也就是Spring boot和cxf的整合。

其实这二者的整合十分的简单,比以前xml的方式更加的简洁,所有相关的代码如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21
@Configuration

public class CxfConfig {

@Bean

public ServletRegistrationBean dispatcherServlet() {

return new ServletRegistrationBean(new CXFServlet(), "/soap/*");

}

@Bean(name = Bus.DEFAULT_BUS_ID)

public SpringBus springBus() {

return new SpringBus();

}

@Bean

public UserService userService() {

return new UserServiceImpl();

}

@Bean

public Endpoint endpoint() {

EndpointImpl endpoint = new EndpointImpl(springBus(), userService());

endpoint.publish("/user");

return endpoint;

}

}

可以看到从配置cxf到发布服务,都只需要一二行代码,出乎意料的简单吧?

到这里我们所有的操作就都完成了,启动Spring boot,访问 http://localhost:8080/soap/user?wsdl

可以看到有相关的wsdl描述信息输出了,说明服务已经发布了。

调用服务

发布了web service服务,那怎么调用呢,像整合一些第三方接口也是先有调用才后有发布啊?

调用soap web service,一般的方法是根据wsdl生成客户端代码,整合之后就可以像调用本地接口一样使用了。

但是我个人不怎么喜欢这种方式,每个接口都要生成一次还有一堆的代码,感觉比较麻烦。

相对更喜欢传入方法名调用的方式,显得清爽而简洁,以下就是所有代码了:

?

1

2

3

4

5

6
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();

Client client = dcf.createClient("http://localhost:8080/soap/user?wsdl");

Object[] objects = client.invoke("getUser", 10002L);

//输出调用结果

System.out.println(objects[0].getClass());

System.out.println(objects[0].toString());

这种方式要注意的就是,如果调用的服务接口返回的是一个自定义对象,那么结果Object[]中的数据类型就成了这个自定义对象(组件帮你自动生成了这个对象),

但是你本地可能并没有这个类,所以需要自行转换处理,最简单的是新建一个跟返回结果一模一样的类进行强转,当然更好的方式是封装一个通用的,这个不是本文主题就不在这深入讨论了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。

原文链接:http://blog.csdn.net/hj7jay/article/details/51130386

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Spring boot 整合CXF开发web service示例 https://www.kuaiidc.com/117054.html

相关文章

发表评论
暂无评论