Springboot + cxf集成web service接口

Java教程 > Spring > 编程 (1624) 2024-08-07 11:05:25
最近工作中需要用到webservice,而且结合spring boot进行开发,参照了一些网上的资料,配置过程中出现的了一些问题,于是写了这篇博客,记录一下我这次spring boot+cxf开发的webservice的配置过程,仅供参考。
一、项目是基于springboot搭建的webservice接口,首先是cxf接口,需要的jar包
<!-- cxf支持 -->
		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-frontend-jaxws</artifactId>
			<version>3.2.1</version>
		</dependency>

		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-transports-http</artifactId>
			<version>3.2.1</version>
		</dependency>
二、创建实体类,内容是用户信息查询和记录
package com.yeyue.cxfws.model;

import java.io.Serializable;

/**
 * @ClassName: User
 * @Description: user实体对象
 * @author: xiaoboLi
 * @date: 2017/11/20 17:20
 * @Copyright: 2017 All rights reserved.
 */
public class User implements Serializable {
    private Long id;
    private String username;
    private String password;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

三、接下来创建接口类
package com.yeyue.cxfws.service;

import com.yeyue.cxfws.model.User;

import javax.jws.WebService;

/**
 * @ClassName: UserService
 * @Description: 接口
 * @author: xiaoboLi
 * @date: 2017/11/20 17:22
 * @Copyright: 2017 All rights reserved.
 */
@WebService
public interface UserService {
    User getUser(Long id);
}
四、创建接口实现类
package com.yeyue.cxfws.service.impl;

import com.yeyue.cxfws.model.User;
import com.yeyue.cxfws.service.UserService;

import javax.jws.WebService;
import java.util.HashMap;
import java.util.Map;

/**
 * @ClassName: UserServiceImpl
 * @Description: 描述
 * @author: xiaoboLi
 * @date: 2017/11/20 17:23
 * @Copyright: 2017 All rights reserved.
 */
@WebService(targetNamespace = "http://service.cxfws.yeyue.com/", endpointInterface = "com.yeyue.cxfws.service.UserService")
public class UserServiceImpl implements UserService {
    Map<Long, User> userMap = new HashMap<>();

    public UserServiceImpl() {
        System.out.println("向实体类插入数据");
        User user = new User();
        user.setId(1L);
        user.setUsername("test1");
        user.setPassword("aaaaaa");
        userMap.put(user.getId(), user);
        user.setId(2L);
        user.setUsername("test1");
        user.setPassword("aaaaaa");
        userMap.put(user.getId(), user);
        user.setId(3L);
        user.setUsername("test1");
        user.setPassword("aaaaaa");
        userMap.put(user.getId(), user);
    }

    @Override
    public User getUser(Long id) {
        return userMap.get(id);
    }
}
注释说明:在发布服务之前,需要在这里对service实现类的配置进行说明如图部分:

操作示例图-3f2ce249d2bb4154b387ef311660ec07.png
http://service.cxfws.yeyue.com/这是我的业务类所在路径
com.yeyue.cxfws.service.UserService这是我的接口所在路径
如果不加上上述内容,发布的接口路径wsdl中的targetNamespace会是类默认的路径,并且客户端在进行调用的时候会报错:
No operation was found with the name {http://impl.service.demo.paybay.cn/}getUser.
那么原因就是:在CXF发布服务的时候,发布的是业务类(UserServiceImpl.java),那么默认的命名空间就会是业务类所在包(路径),而对外界暴露的则是接口类(UserService.java),那么对于客户端调用的时侯,需要按照接口类所在路径进行命名空间的定义。
所以在发布之前我们要在业务类(UserServiceImpl.java)上增加注解,指定命名空间,然后再进行发布,
操作示例图-12806853926e4224aeaae2dd9bfc093e.png
五、接下来我就要对webservice服务进行发布:
package com.yeyue.cxfws.config;

import com.yeyue.cxfws.service.UserService;
import com.yeyue.cxfws.service.impl.UserServiceImpl;
import org.apache.cxf.Bus;
import org.apache.cxf.bus.spring.SpringBus;
import javax.xml.ws.Endpoint;
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.transport.servlet.CXFServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @ClassName: WebServiceConfig
 * @Description: 发布webservice接口
 * 访问地址:http://localhost:8080/test/user?wsdl
 * @author: xiaoboLi
 * @date: 2017/11/20 17:35
 * @Copyright: 2017 All rights reserved.
 */
@Configuration
public class CxfWebServiceConfig {
    @Bean
    public ServletRegistrationBean dispatcherServlet() {
        //接口部署的前部分地址
        return new ServletRegistrationBean(new CXFServlet(), "/test/*");
    }
    @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());
        //访问的wsdl路径
        endpoint.publish("/user");
        return endpoint;
    }
}
 
那么到这里呢,我们的所有的步骤基本完成了,启动spring boot 然后再浏览器中输入url:http://localhost:8080/webservice/test/user?wsdl
可以看到有相关的wsdl描述信息输出了,说明服务已经发布了。
六、调用服务
package com.yeyue.cxfws.test;

import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;

/**
 * @ClassName: Client
 * @Description: 描述
 * @author: xiaoboLi
 * @date: 2017/11/20 18:18
 * @Copyright: 2017 All rights reserved.
 */
public class Client {
    public static void main(String[] args) throws Exception {
        JaxWsDynamicClientFactory dcf =JaxWsDynamicClientFactory.newInstance();
        org.apache.cxf.endpoint.Client client =dcf.createClient("http://localhost:8080/webservice/test/user?wsdl");
        Object[] objects=client.invoke("getUser",1L);
        System.out.println("*****"+objects[0].toString());
    }
}
最后附上项目层级结构
操作示例图-dc504cf0484c4f30bf180e66d28d7f1f.png




相关文章
cxf、Springboot、webservice 源文:https://www.cnblogs.com/fuxin41/p/6289162.html
spring boot整合cxf发布webservice服务和cxf客户端调用,说起web service最近几年restful大行其道,大有取代传统soap web service的趋势,但是...
WebService 常见面试问题解答,在这篇文章中,我们几乎涵盖了您需要熟悉的Webservice概念的每个知识点部分,以回答任何层级问题。您还可以在分类中找到最佳的WebService服务面...
Java 10上的Apache CXF
Java编程中纯jdk java方式编写webservice服务(server)和客服端(client)
spring boot整合Jersey2.x实现JAX-RS webservice
本篇博客讲的spring boot如何集成 spring web service,如果您想用Apache CXF集成,那么可能不适合您。为什么使用spring web servce 项目地址 呢...
spring boot RPC 框架 Hessian,本文主要讲解spring boot整合hessian实现Spring boot RPC调用和Spring boot rpc框架hessian...
FactoryBean 是用作在IoC 容器中创建其他 bean 的工厂bean 。从概念上讲,FactoryBean 与factory method非常相似,但它是 Spring 特定的 be...
在 Spring 框架中,如果您想通过调用静态工厂方法来创建 bean ,其目的是将对象创建过程封装在static方法中,那么您可以使用factory-method属性。静态工厂方法示例如果你想...
了解将资源或文件(例如文本文件、XML 文件、属性文件或图像文件)加载到 Spring 应用程序上下文中的不同方法。Spring ResourceLoader为我们通过资源路径getResour...
Spring Boot定时任务阻塞解决方式一:修改定时任务的线程数量修改spring boot项目的application配置文件,将下面的配置修改为合适的值,默认1表示所有定时任务都是一个线程...
spring validate 验证List集合演示用类User/Addressimport lombok.Data; import javax.validation.constraint...
Spring boot 参数分组校验项目源码下载:demo-boot-group-validation.zip​​​​​​​ 访问密码:9987分组校验演示项目结构演示项目创建maven主要依赖...