博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CXF2.7整合spring发布webservice
阅读量:6278 次
发布时间:2019-06-22

本文共 10941 字,大约阅读时间需要 36 分钟。

---------==========--服务端发布webservice-=============--------

1.需要的jar包:

 

2.包结构

 

 

 3.代码

1.实体类

package cn.qlq.domain;public class User {    private String username;    private String password;    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;    }    @Override    public String toString() {        return "User [username=" + username + ", password=" + password + "]";    }}

 

 

 

2.dao代码:

package cn.qlq.dao;import java.sql.SQLException;import cn.qlq.domain.User;public interface UserDao {    /**     * 保存用户     *      * @param user     * @return     * @throws SQLException     */    public int saveUser(User user) throws SQLException;    /**     * 根据userId获取user     *      * @param userId     * @return     */    public User getUserById(int userId);}

 

 

package cn.qlq.dao.impl;import java.sql.SQLException;import org.springframework.stereotype.Repository;import cn.qlq.dao.UserDao;import cn.qlq.domain.User;@Repositorypublic class UserDaoImpl implements UserDao {    public UserDaoImpl(){        System.out.println("=====生成userDao=====");    }        @Override    public int saveUser(User user) throws SQLException {        System.out.println("保存用户");        return 0;    }    @Override    public User getUserById(int userId) {        // 模拟从数据库取数据        User u = new User();        u.setUsername("qlq");        u.setPassword("123456");        return u;    }}

 

 

 

3.service代码:

package cn.qlq.service;import java.sql.SQLException;import javax.jws.WebMethod;import javax.jws.WebService;import cn.qlq.domain.User;@WebServicepublic interface UserService {    /**     * 保存用户     *      * @param user     * @return     * @throws SQLException     */    public int saveUser(User user) throws SQLException;    /**     * 根据userId获取user     *      * @param userId     * @return     */    @WebMethod    public User getUserById(int userId);}

 

 

package cn.qlq.service.impl;import java.sql.SQLException;import javax.jws.WebService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import cn.qlq.dao.UserDao;import cn.qlq.domain.User;import cn.qlq.service.UserService;@Service@WebServicepublic class UserServiceImpl implements UserService {    @Autowired    private UserDao userDao;    @Override    public int saveUser(User user) throws SQLException {        System.out.println("----------------保存user----------");        return 0;    }    @Override    public User getUserById(int userId) {        return userDao.getUserById(userId);    }}

 

 

4.配置文件

 application.xml

经测试:上面的import不需要也是可以的。 (而且最好不写上面三个)

 

 web.xml

CXFTest
index.jsp
contextConfigLocation
classpath:application.xml
org.springframework.web.context.ContextLoaderListener
CXFServlet
org.apache.cxf.transport.servlet.CXFServlet
1
CXFServlet
/WS/*

 

 

5.启动服务进行测试:

查看有哪些发布的webservice:

 

 

 

查看WSDL描述:

 

 

 

6.第二种xml配置发布webservice的配置可以参考:

  这种方式配置可以查看日志,也就是传的参数与返回值(XML格式的数据)都可以在日志中查看:

例如修改上面的application的配置:

 

启动服务查看有哪些发布的服务:

 

 

测试访问一个服务:

import javax.xml.namespace.QName;import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;public class TestWS {    public static void main(String[] args) throws Exception {        JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();        org.apache.cxf.endpoint.Client client = dcf.createClient("http://localhost/CXFTest/WS/userws?wsdl"); // url为调用webService的wsdl地址        QName name = new QName("http://service.qlq.cn/", "getAllUsers");// namespace是命名空间,methodName是方法名        Object[] objects;        try {            objects = client.invoke(name);// 第一个参数是上面的QName,第二个开始为参数,可变数组            System.out.println(objects[0].toString());        } catch (Exception e) {            e.printStackTrace();        }    }}

 

 

查看服务端日志(控制台):

----------------------------ID: 1Address: http://localhost/CXFTest/WS/userws?wsdlHttp-Method: GETContent-Type: text/xmlHeaders: {Accept=[*/*], cache-control=[no-cache], connection=[keep-alive], content-type=[text/xml], host=[localhost], pragma=[no-cache], user-agent=[Apache CXF 2.7.4]}--------------------------------------九月 15, 2018 2:31:32 下午 org.apache.cxf.staxutils.StaxUtils createXMLInputFactory警告: Could not create a secure Stax XMLInputFactory.  Found class com.ctc.wstx.stax.WstxInputFactory.  Suggest Woodstox 4.2.0 or newer.九月 15, 2018 2:31:41 下午 org.apache.cxf.services.userService.UserServicePort.UserService信息: Inbound Message----------------------------ID: 2Address: http://localhost/CXFTest/WS/userwsEncoding: UTF-8Http-Method: POSTContent-Type: text/xml; charset=UTF-8Headers: {Accept=[*/*], cache-control=[no-cache], connection=[keep-alive], Content-Length=[162], content-type=[text/xml; charset=UTF-8], host=[localhost], pragma=[no-cache], SOAPAction=[""], user-agent=[Apache CXF 2.7.4]}Payload: 
--------------------------------------九月 15, 2018 2:31:42 下午 org.apache.cxf.services.userService.UserServicePort.UserService信息: Outbound Message---------------------------ID: 2Encoding: UTF-8Content-Type: text/xmlHeaders: {}Payload:
0
0
1
1
2
2
--------------------------------------

 

 

 

 

=========客户端使用webservice:============

  无论哪种方式调用都会调用到发布的webservice的实现类的代码(项目中的代码)。也就是必须依赖tomcat服务器启动才能访问webservice的实现代码,如果tomcat没启动将访问不到wsdl。并且会报访问不到wsdl与连接拒绝的错误。

  访问方式基本上有三种,生成本地代码、静态代理、动态代理。

 

1.利用JDK自带的工具生成代码到本地的方式进行(不依赖于CXF框架)

C:\Users\liqiang\Desktop>cd webserviceC:\Users\liqiang\Desktop\webservice>wsimport http://localhost/CXFTest/WS/userws?wsdlparsing WSDL...Generating code...Compiling code...

 

会将代码生成到本地,如下:

 

 打成jar包后使用:

C:\Users\liqiang\Desktop\webservice>jar cvf wstest.jar ./已添加清单正在添加: cn/(输入 = 0) (输出 = 0)(存储了 0%)正在添加: cn/qlq/(输入 = 0) (输出 = 0)(存储了 0%)正在添加: cn/qlq/service/(输入 = 0) (输出 = 0)(存储了 0%)正在添加: cn/qlq/service/GetUserById.class(输入 = 605) (输出 = 376)(压缩了 37%)正在添加: cn/qlq/service/GetUserByIdResponse.class(输入 = 763) (输出 = 424)(压缩了 44%)正在添加: cn/qlq/service/impl/(输入 = 0) (输出 = 0)(存储了 0%)正在添加: cn/qlq/service/impl/SQLException.class(输入 = 788) (输出 = 422)(压缩了 46%)正在添加: cn/qlq/service/impl/UserService.class(输入 = 1050) (输出 = 507)(压缩了 51%)正在添加: cn/qlq/service/impl/UserServiceImplService.class(输入 = 2369) (输出 = 1050)(压缩了正在添加: cn/qlq/service/ObjectFactory.class(输入 = 3124) (输出 = 1009)(压缩了 67%)正在添加: cn/qlq/service/package-info.class(输入 = 242) (输出 = 195)(压缩了 19%)正在添加: cn/qlq/service/SaveUser.class(输入 = 656) (输出 = 384)(压缩了 41%)正在添加: cn/qlq/service/SaveUserResponse.class(输入 = 694) (输出 = 411)(压缩了 40%)正在添加: cn/qlq/service/SQLException.class(输入 = 1036) (输出 = 525)(压缩了 49%)正在添加: cn/qlq/service/User.class(输入 = 798) (输出 = 434)(压缩了 45%)

 

 

导入eclipse中测试:

测试代码:

import cn.qlq.service.User;import cn.qlq.service.impl.UserService;import cn.qlq.service.impl.UserServiceImplService;public class TestWS {    public static void main(String[] args) {        UserServiceImplService us = new UserServiceImplService();        UserService userService = us.getUserServiceImplPort();        User user = userService.getUserById(0);        System.out.println(user.getUsername()+"\t"+user.getPassword());    }    }

 

 

结果:

qlq 123456

 

 

2.第二种方式:静态代理:(依赖于CXF框架,而且需要将接口写在对应包下---与webservice保持一致)

目录结构:

 

 jar包:

 

 测试类:

import org.apache.cxf.interceptor.LoggingInInterceptor;import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;import cn.qlq.domain.User;import cn.qlq.service.UserService;public class TestWS {    public static void main(String[] args) throws Exception {        // 创建WebService客户端代理工厂        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();        // 判断是否抛出异常        factory.getOutInterceptors().add(new LoggingInInterceptor());        // 注册webservice接口        factory.setServiceClass(UserService.class);        // 配置webservice地址        factory.setAddress("http://localhost/CXFTest/WS/userws?wsdl");        // 获得接口对象        UserService service = (UserService) factory.create();        // 调用接口方法        User user = service.getUserById(5);        // 关闭接口连接        System.out.println(user.getUsername() + "\t" + user.getPassword());    }}

 

结果:

qlq 123456

 

3.动态调用:(推荐这种)

import javax.xml.namespace.QName;import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;public class TestWS {    public static void main(String[] args) throws Exception {        JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();        org.apache.cxf.endpoint.Client client = dcf.createClient("http://localhost/CXFTest/WS/userws?wsdl"); // url为调用webService的wsdl地址        QName name = new QName("http://service.qlq.cn/", "getUserById");// namespace是命名空间,methodName是方法名        int userId = 1;        Object[] objects;        try {            objects = client.invoke(name, userId);// 第一个参数是上面的QName,第二个开始为参数,可变数组            System.out.println(objects[0].toString());        } catch (Exception e) {            e.printStackTrace();        }    }} 

 参数解释:

 

 

 注意:如果上面报错:

  org.apache.cxf.common.i18n.UncheckedException: No operation was found with the name

 

我们需要将targetNamespace和namespace保持一致,如下:

 

 

我们需要将实现类和接口放在同一个包下,或者对服务端的接口实现类中的@WebService添加targetNamespace,其值为接口包名的倒置,例如上面我的配置为:(只用包名)

package cn.qlq.service.impl;import java.sql.SQLException;import javax.jws.WebService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import cn.qlq.dao.UserDao;import cn.qlq.domain.User;import cn.qlq.service.UserService;@Service@WebService(targetNamespace = "http://service.qlq.cn")public class UserServiceImpl implements UserService {    @Autowired    private UserDao userDao;    @Override    public int saveUser(User user) throws SQLException {        System.out.println("----------------保存user----------");        return 0;    }    @Override    public User getUserById(int userId) {        System.out.println("----------------获取user----------" + userId);        return userDao.getUserById(userId);    }}

 

结果:

 

 

  至此webservice的发布与使用基本完成,明天还会在项目中实际发布webservice,以及测试webservice类改变运用上面三种方式访问webservice的结果。

 

参考:

 

转载地址:http://vgyva.baihongyu.com/

你可能感兴趣的文章
IntelliJ IDEA 常用设置讲解
查看>>
软件的描述x
查看>>
深度 | AI芯片之智能边缘计算的崛起——实时语言翻译、图像识别、AI视频监控、无人车这些都需要终端具有较强的计算能力,从而AI芯片发展起来是必然,同时5G网络也是必然...
查看>>
spring boot微服务改造冲突
查看>>
OAuth2 Demo PHP
查看>>
真机测试出现INSTALL_FAILED_USER_RESTRICTED安装错误
查看>>
Mybateis mapper 接口 example 用法
查看>>
js图片转base64并压缩
查看>>
关于server和虚拟主机的差别
查看>>
散列表(二)冲突处理的方法之链地址法的实现: 哈希查找
查看>>
【ztree】zTree节点增删改
查看>>
安装用于跨平台移动开发的 Visual C++
查看>>
kafka-manager 的编译和使用(附安装包)
查看>>
JDK1.8源码(五)——java.util.ArrayList 类
查看>>
Spring Data JPA 实例查询
查看>>
.NET成年了,然后呢?
查看>>
Leaf——美团点评分布式ID生成系统
查看>>
Redis集群中的节点如何保证数据一致
查看>>
jsp里面不能使用${pageContext.request.contextPath}解决方案
查看>>
Spring注解之 @EnableScheduling计划任务注解
查看>>