CXF2.7整合spring发布webservice

---------==========--服务端发布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;

@Repository
public 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;

@WebService
public 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
@WebService
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) {
        return userDao.getUserById(userId);
    }

}

4.配置文件

application.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://cxf.apache.org/jaxws http://cxf.apache.org/jaxws http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <!-- 引cxf的一些核心配置 -->
    <import resource="classpath:META-INF/cxf/cxf.xml" />
    <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

    <!-- 自动扫描dao和service包(自动注入) -->
    <context:component-scan base-package="cn.qlq" />

    <jaxws:endpoint id="userWS" implementor="cn.qlq.service.impl.UserServiceImpl"
        address="/userws">
    </jaxws:endpoint>

</beans>

经测试:上面的import不需要也是可以的。

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">
    <display-name>CXFTest</display-name>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:application.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>CXFServlet</servlet-name>
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>CXFServlet</servlet-name>
        <url-pattern>/WS/*</url-pattern>
    </servlet-mapping>
</web-app>

5.启动服务进行测试:

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

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

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

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

C:\Users\liqiang\Desktop>cd webservice

C:\Users\liqiang\Desktop\webservice>wsimport http://localhost/CXFTest/WS/userws?
parsing 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的结果。

原文地址:https://www.cnblogs.com/qlqwjy/p/9644078.html

时间: 2024-12-16 14:18:12

CXF2.7整合spring发布webservice的相关文章

CXF整合Spring开发WebService

刚开始学webservice时就听说了cxf,一直没有尝试过,这两天试了一下,还不错,总结如下: 要使用cxf当然是要先去apache下载cxf,下载完成之后,先要配置环境变量,有以下三步: 1.打开环境变量配置窗口,点击新建,新建%CXF_HOME%变量,值为你下载的cxf所在的目录,我的是D:\tools\apache-cxf-3.1.0 2.在Path变量中新加一句%CXF_HOME%\lib,注意要和已有的path变量用;隔开 3.在CLASSPATH中新加一句%CXF_HOME%\li

webService总结(三)——使用CXF + Spring发布webService

近些年来,Spring一直很火,许多框架都能跟Spring完美集成,CXF也不例外.下面,我就介绍一下如何使用CXF + Spring发布webService.我们还是使用前两篇博客使用的实例. 服务端: 目录结构: 这里需要的所有Spring的包,CXF的lib目录下都有. IHelloWorldServer代码: package com.test.server; import javax.jws.WebService; @WebService public interface IHelloW

cxf整合spring实现webservice

前面一篇文章中,webservice的服务端与客户端都是单独启动,但是在现实项目中,服务端单独启动太没有实际意义了,还是要整合框架启动,所以今天将记录如何整合spring框架. jar包下载地址如下: http://yun.baidu.com/share/link?shareid=547689626&uk=2836507213 (一).web.xml中添加spring与cxf的配置 <?xml version="1.0" encoding="UTF-8"

SpringBoot整合cxf发布webService

1. 看看项目结构图 2. cxf的pom依赖 1 <dependency>2 <groupId>org.apache.cxf</groupId>3 <artifactId>cxf-spring-boot-starter-jaxws</artifactId>4 <version>3.2.4</version>5 </dependency> 3. 开始编写webService服务端3.1 实体类entity 1

cxf+spring发布webservice和调用

项目所需jar包:http://files.cnblogs.com/files/walk-the-Line/cxf-spirng.zip 首先写一个demo接口 package cn.cxf.demo; import javax.jws.WebService; @WebService public interface Demo { String sayHi(String text); } 然后就需要它的实现类 targetNamespace 是指向接口的包路径 package cn.cxf.de

cxf整合spring发布rest服务

1.创建maven web项目并添加依赖 pom.xml 1 <properties> 2 <webVersion>3.0</webVersion> 3 <cxf.version>3.2.5</cxf.version> 4 <spring.version>4.3.18.RELEASE</spring.version> 5 <jettison.version>1.4.0</jettison.version&

spring boot整合cxf发布和调用webservice

一.前言 说起web service最近几年restful大行其道,大有取代传统soap web service的趋势,但是一些特有或相对老旧的系统依然使用了传统的soap web service,例如银行.航空公司的机票查询接口等.本博客主要讲解得是spring boot整合cxf发布webservice服务和spring boot整合cxf客户端调用webservice服务本案例使用maven方式二.编码核心文件清单1.pom.xml <?xml version="1.0"

Spring 集合cxf发布webservice

通过spring发布webservice接口 spring jar包+cxf jar Java包 以下文件缺少jar包需要自行去下载 项目结构 1.实体类 package com.test.entity; public class User { public User(String name, String pwd, String sex) { super(); this.name = name; this.pwd = pwd; this.sex = sex; } private String

WebService—CXF整合Spring实现接口发布和调用过程2

一.CXF整合Spring实现接口发布 发布过程如下: 1.引入jar包(基于maven管理) <!-- cxf --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>2.7.18</version> </dependency> <de