全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

详解Spring boot+CXF开发WebService Demo

最近工作中需要用到webservice,而且结合spring boot进行开发,参照了一些网上的资料,配置过程中出现的了一些问题,于是写了这篇博客,记录一下我这次spring boot+cxf开发的webservice的配置过程,仅供参考。

一、本次开发除了用到spring boot基础jar包外,还用到了cxf相关jar包:

<!-- cxf支持 -->
    <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>

二、首先我们创建一个实体类,内容是关于用户信息的查询和记录:

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable {

  private static final long serialVersionUID = -5939599230753662529L;
  private String       userId;
  private String      username;
  private String      age;
  private Date       updateTime;
  //getter setter ......
  public void setUserId(String userId) {
    this.userId=userId;
  }
  public void setUsername(String username) {
    this.username=username;
  }
  public void setAge(String age) {
    this.age=age;
  }
  public void setUpdateTime(Date updateTime) {
    this.updateTime=updateTime;
  }
  
  
  public String getUserId() {
    return userId;
  }
  public String getUserName() {
    return username;
  }
  public String getAge() {
    return age;
  }
  public Date getUpdateTime() {
    return updateTime;
  }
}

三、接下来我们创建接口类:

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;

import cn.paybay.demo.entity.User;


@WebService
public interface UserService {

  @WebMethod
  String getName(@WebParam(name = "userId") String userId);
  @WebMethod
  User getUser(String userId);
}

四、有了接口类,那么接下来我们对接口进行实现,也就是接口实现类(也就是业务类)代码:

package cn.paybay.demo.service.impl;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;



import javax.jws.WebService;

import cn.paybay.demo.entity.User;
import cn.paybay.demo.service.UserService;

@WebService(targetNamespace="http://service.demo.paybay.cn/",endpointInterface = "cn.paybay.demo.service.UserService")
public class UserServiceImpl implements UserService{
  
  private Map<String, User> userMap = new HashMap<String, User>();
  public UserServiceImpl() {
    System.out.println("向实体类插入数据");
    User user = new User();
    user.setUserId("411001");
    user.setUsername("zhansan");
    user.setAge("20");
    user.setUpdateTime(new Date());
    userMap.put(user.getUserId(), user);
    
    user = new User();
    user.setUserId("411002");
    user.setUsername("lisi");
    user.setAge("30");
    user.setUpdateTime(new Date());
    userMap.put(user.getUserId(), user);
    
    user = new User();
    user.setUserId("411003");
    user.setUsername("wangwu");
    user.setAge("40");
    user.setUpdateTime(new Date());
    userMap.put(user.getUserId(), user);
  }
  @Override
  public String getName(String userId) {
    return "liyd-" + userId;
  }
  @Override
  public User getUser(String userId) {
    System.out.println("userMap是:"+userMap);
    return userMap.get(userId);
  }

}

注释(PS):在发布服务之前,我们要在这里对业务实现类进行一下说明,请大家看下图箭头指向的方框部分

下面我来解释一下加上图方框箭头所指代码的目的:

http://impl.service.demo.paybay.cn/:这是我的业务类所在路径;

http://service.demo.paybay.cn/:这是我的接口类所在路径;

在不加上图方框箭头所指代码的情况下,你最后发服务的结果是这样的(如下图):

并且会在你进行客户端调用的时候回报错:No operation was found with the name {http://impl.service.demo.paybay.cn/}getUser.那么原因就是:在CXF发布服务的时候,发布的是业务类(UserServiceImpl.java),那么默认的命名空间就会是业务类所在包(路径),而对外界暴露的则是接口类(UserService.java),那么对于客户端调用的时侯,需要按照接口类所在路径进行命名空间的定义。

所以在发布之前我们要在业务类(UserServiceImpl.java)上增加注解,指定命名空间,然后再进行发布,

那么我们最终在加上(图一)方框箭头所指代码情况下,发布服务的结果为下图(请看图三):

五、(发布服务)接口类,业务类代码都已经准备好,那么我接下来我就要对webservice服务进行发布:

代码如下:

import javax.xml.ws.Endpoint;

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.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import cn.paybay.demo.service.UserService;
import cn.paybay.demo.service.impl.UserServiceImpl;


@Configuration
public class TestConfig {
  
     @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());
      endpoint.publish("/user");
      return endpoint;
    }

}

那么到这里呢,我们的所有的步骤基本完成了,启动spring boot 然后再浏览器中输入url:http://localhost:8080/webservice/test/user?wsdl

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

那么这里我又要增加注释了,请大家注意,我在最初查询资料,配置demo的时候,启动以后,发布时候总是报404,网上有很多关于什么端口冲突等说法,我试过后,根本不是那一回事,然后我无意中尝试了一下,在url地址处加入工程名,结果,问题解决了。

因此请大家注意:在测试发布服务的时候,你在浏览器中输入的url地址应该是:http://localhost:8080/你的工程名/test/user?wsdl;

然后就是发布结果如下图(见图四):

到此为止,我们的服务发布成功了。

六、调用服务

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


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");
    //getUser 为接口中定义的方法名称 张三为传递的参数  返回一个Object数组
    Object[] objects=client.invoke("getUser","411001");
    //输出调用结果
    System.out.println("*****"+objects[0].toString());
  }
  
}

七、最后附上我的工程结构图(见图五):

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


# spring  # boot  # cxf  # 集成cxf  # SpringBoot使用CXF集成WebService的方法  # spring boot 开发soap webservice的实现代码  # springboot整合cxf发布webservice以及调用的方法  # Spring Boot 实现Restful webservice服务端示例代码  # Spring boot 整合CXF开发web service示例  # Spring boot webService使用方法解析  # 请大家  # 这是  # 要在  # 然后再  # 如下图  # 上图  # 见图  # 的是  # 客户端  # 情况下  # 器中  # 我就  # 就会  # 我在  # 有很多  # 是这样  # 结构图  # 则是  # 我来  # 你在 


相关文章: 济南网站制作的价格,历城一职专官方网站?  建站主机空间推荐 高性价比配置与快速部署方案解析  如何构建满足综合性能需求的优质建站方案?  建站之星如何配置系统实现高效建站?  太原网站制作公司有哪些,网约车营运证查询官网?  如何获取上海专业网站定制建站电话?  如何在宝塔面板创建新站点?  ui设计制作网站有哪些,手机UI设计网址吗?  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  建站主机与虚拟主机有何区别?如何选择最优方案?  音乐网站服务器如何优化API响应速度?  如何批量查询域名的建站时间记录?  建站之星免费模板:自助建站系统与智能响应式一键生成  如何快速搭建二级域名独立网站?  如何挑选优质建站一级代理提升网站排名?  如何在企业微信快速生成手机电脑官网?  香港服务器租用每月最低只需15元?  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  湖州网站制作公司有哪些,浙江中蓝新能源公司官网?  建站主机如何选?高性价比方案全解析  如何选择高性价比服务器搭建个人网站?  长沙企业网站制作哪家好,长沙水业集团官方网站?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  制作网站公司那家好,网络公司是做什么的?  如何通过wdcp面板快速创建网站?  网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?  微信推文制作网站有哪些,怎么做微信推文,急?  建站之星导航如何优化提升用户体验?  移民网站制作流程,怎么看加拿大移民官网?  台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  公司网站制作价格怎么算,公司办个官网需要多少钱?  如何用狗爹虚拟主机快速搭建网站?  深圳 网站制作,深圳招聘网站哪个比较好一点啊?  电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  建站中国官网:模板定制+SEO优化+建站流程一站式指南  网站制作新手教程,新手建设一个网站需要注意些什么?  javascript基本数据类型及类型检测常用方法小结  建站之星安全性能如何?防护体系能否抵御黑客入侵?  建站之星logo尺寸如何设置最合适?  合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?  已有域名和空间如何搭建网站?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  c# F# 的 MailboxProcessor 和 C# 的 Actor 模型  制作网站外包平台,自动化接单网站有哪些?  宝塔新建站点为何无法访问?如何排查?  如何通过WDCP绑定主域名及创建子域名站点?  南阳网站制作公司推荐,小学电子版试卷去哪里找资源好? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。