java程序调用xfire发布的webService服务(二)

在上一篇的调用xfire发布的webService服务中,我只是从服务端返回了一个字符串给客户端,却没有测试从客户端传递数据给服务端。而实际应用中一般是不太可能只出现这样的应用场景的,因此我便更进一步测试了客户端传递数据给服务端。

因为相关的jar包在上一篇已经说过,因此便不再重复说明,这次的测试步骤如下:

一、测试向服务端传递字符串(重点在第二个):

为了进一步理解服务搭建,我重新写了一个服务端服务类:

接口:

package xfireTest;

public interface XFireTestService {
    public String test(String cont);
}

实现类:

package xfireTest.xfireTestImp;
import xfireTest.XFireTestService;

public class XFireTestImp implements XFireTestService {

    @Override
    public String test(String cont) {
        cont = "webService收到消息:" + cont;
        return cont;
    }
}

在之前的services.xml中加入了以下代码:

<service xmlns="http://xfire.codehaus.org/config/1.0">
        <!-- webService服务的名称 -->
        <name>XFireTest</name>
        <namespace>http://xfireTest/XFireTestService</namespace>
        <!-- 自己所写的接口路径 -->
        <serviceClass>
            xfireTest.XFireTestService
        </serviceClass>
        <!-- 实现类路径 -->
        <implementationClass>
            xfireTest.xfireTestImp.XFireTestImp
        </implementationClass>
    </service>

然后是另外一个项目中模拟客户端调用代码,同样是需要先创建和服务端一样的服务接口:

package test;

public interface XFireTestService {
    public String test(String cont);
}

然后是调用:

package test;

import org.codehaus.xfire.XFireFactory;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;

public class CallWebServiceTest1 {
    public static void main(String[] args) {
        Service srModel = new ObjectServiceFactory()
                .create(XFireTestService.class);
        XFireProxyFactory factory = new XFireProxyFactory(XFireFactory
                .newInstance().getXFire());// 创建工厂实例

        String helloURL = "http://localhost:8082/xfireTest/services/XFireTest";
        try {
            XFireTestService service = (XFireTestService) factory.create(
                    srModel, helloURL);
            System.out.println(service.test("测试"));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

这里的调用是比较简单的,也没有什么问题,字符串的传递完全可以。

二、调用时传递对象(重点在结尾处)

这个测试,我写了一个简单的UserModel类,用来当做参数使用,根据网上的一些资料,我给实体类做了序列化,如下:

package xfireTest;
import java.io.Serializable;
public class UserModel implements Serializable {

    /**
     *
     */
    private static final long serialVersionUID = -8344776127885486411L;

    public UserModel() {
        super();
    }

    public UserModel(String userName, int age) {
        super();
        this.userName = userName;
        this.age = age;
    }

    /**
     * 用户名
     */
    private String userName;
    /**
     * 用户年龄
     */
    private int age;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "UserModel [userName=" + userName + ", age=" + age + "]";
    }
}

然后是对应的接口:

package xfireTest;
import javax.jws.WebParam;
import javax.jws.WebService;

@WebService(serviceName = "UserService", targetNamespace = "http://xfireTest/UserService")
public interface UserService {
    public UserModel addUser(@WebParam(name = "user") UserModel user);
}

实现类:

package xfireTest.xfireTestImp;
import xfireTest.UserModel;
import xfireTest.UserService;
public class UserServiceImp implements UserService {

    @Override
    public UserModel addUser(UserModel user) {
        // System.out.println(user);
        System.out.println(user.getUserName() + ":" + user.getAge());
        return user;
    }
}

services.xml中加入如下代码:

 <service xmlns="http://xfire.codehaus.org/config/1.0">
        <!-- webService服务的名称 -->
        <name>UserService</name>
        <namespace>http://xfireTest/UserService</namespace>
        <!-- 自己所写的接口路径 -->
        <serviceClass>
            xfireTest.UserService
        </serviceClass>
        <!-- 实现类路径 -->
        <implementationClass>
            xfireTest.xfireTestImp.UserServiceImp
        </implementationClass>
    </service>

然后是客户端调用的代码:

package test;
import org.codehaus.xfire.XFireFactory;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;

public class CallWebServiceTest2 {

    public static void main(String[] args) {
        Service srModel = new ObjectServiceFactory().create(UserService.class);
        XFireProxyFactory factory = new XFireProxyFactory(XFireFactory
                .newInstance().getXFire());// 创建工厂实例

        String helloURL = "http://localhost:8082/xfireTest/services/UserService";
        try {
            UserService service = (UserService) factory.create(srModel,
                    helloURL);
            UserModel user = new UserModel();
            user.setAge(22);
            user.setUserName("test");
            System.out.println(service.addUser(user));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }
}

因为和服务端是不同的项目,因此需要自己新建和服务端一样的服务接口以及UserModel类,我都写在和上一个类的同一个包中,即test中:

接口:

package test;
import javax.jws.WebParam;
import javax.jws.WebService;

@WebService(serviceName = "UserService", targetNamespace = "http://xfireTest/UserService")
public interface UserService {
    public UserModel addUser(@WebParam(name = "user") UserModel user);
}

UserModel类:

package test;
import java.io.Serializable;
public class UserModel implements Serializable {

    /**
     *
     */
    private static final long serialVersionUID = 9024481738536854407L;

    public UserModel() {
        super();
    }

    public UserModel(String userName, int age) {
        super();
        this.userName = userName;
        this.age = age;
    }

    /**
     * 用户名
     */
    private String userName;
    /**
     * 用户年龄
     */
    private int age;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "UserModel [userName=" + userName + ", age=" + age + "]";
    }
}

上边这些代码和之前的比较,除开加了一些注解外,基本上没有多大区别,然后启动服务端,并在模拟的客户端中调用,结果控制台的打印信息却不是预想中的,都成了默认值,如图:

于是又查了许多资料,并在项目老大的帮助下找到了原因。竟然是因为我客户端的UserModel类的包名和服务端的不一样,于是新建了一个和服务端一样的包,并把这个UserModel挪过去,然后再启动模拟客户端的main方法,控制台如愿以偿的输出结果,至此整个测试完毕。

时间: 2024-10-24 23:58:14

java程序调用xfire发布的webService服务(二)的相关文章

java程序调用xfire发布的webService服务

昨天用xfire搭好了一个简单的webService的服务,可以在浏览器访问,今天便想要尝试以下如何调用这个服务及相关的方法.在网上查找了一些资料后,实现过程如下. 1.创建一个maven web项目,并创建一个带有main方法的类. 2.导入xfire依赖的一些jar包,为了简单起见,我就把搭建服务端时的jar包都考了过来,放在lib文件夹下,然后如上一篇搭建时一样把jar加入到build path中.                3.创建一个和服务端一样的接口类,必须要有这个接口类才可以:

VS2013如何调用别人发布的WebService程序

这篇经验会告诉我们如何调用别人发布的WebService,并且需要注意的事项.现在就拿获取天气预报的接口举例,因为文中不允许有链接,所以在下文图中有WebService链接的地址. 工具/原料 VS2013 WebService接口 方法/步骤 首先打开VS2013,选择文件->新建->项目.   在项目中选择[控制台应用程序],将项目名称重新命名为[WebServiceTest].   点击项目右键,选择添加->服务引用.   在地址栏中输入WebServie链接地址后回车,然后重新命

自定义及发布一个webservice服务

自定义及发布一个webservice服务    - 声明 某个业务服务为webservice服务       通过@webservice 注解来声明    - 发布webservice服务       Endpoint.publish()发布 (默认对public修饰的方法进行发布)    - 通过wsimport生成本地代理来访问自己发布的webservice       wsimport 1.发布自定义webservice phone.java package ws.myWebService

WebService学习总结(四)——调用第三方提供的webService服务

WebService学习总结(四)——调用第三方提供的webService服务 互联网上面有很多的免费webService服务,我们可以调用这些免费的WebService服务,将一些其他网站的内容信息集成到我们的Web应用中显示,下面就以获取天气预报数据和查询国内手机号码归属地为例进行说明. 气象中心的管理系统将收集的天气信息并将数据暴露出来(通过WebService Server), 而各大站点的应用就去调用它们得到天气信息并以不同的样式去展示(WebService Client).一. 调用

【WebService】调用第三方提供的webService服务(七)

互联网上面有很多的免费webService服务,我们可以调用这些免费的WebService服务,将一些其他网站的内容信息集成到我们的Web应用中显示,下面就以获取天气预报数据和查询国内手机号码归属地为例进行说明. 气象中心的管理系统将收集的天气信息并将数据暴露出来(通过WebService Server), 而各大站点的应用就去调用它们得到天气信息并以不同的样式去展示(WebService Client). 调用免费的WebService获取天气预报信息 1.在网络上查询免费的webservic

httpclient4.x调用cxf发布的webservice的某个方法(有参数,有返回值)(未整合spring)

原文:httpclient4.x调用cxf发布的webservice的某个方法(有参数,有返回值)(未整合spring) 源代码下载地址:httpclient4.x调用cxf发布的webservice的某个方法(有参数,有返回值)(未整合spring) 采用spring + cxf编写服务端 httpclient4编写客户端调用 如题,代码没有jar 完整包: 链接:http://pan.baidu.com/share/link?shareid=2162612373&uk=402880896 密

mysql创建 存储过程 并通过java程序调用该存储过程

create table users_ning(id primary key auto_increment,pwd int); insert into users_ning values(id,1234); insert into users_ning values(id,12345); insert into users_ning values(id,12); insert into users_ning values(id,123); CREATE PROCEDURE login_ning(

java程序调用存储过程

java程序调用存储过程     PL/SQL子程序,很多情况下是给应用程序来调用的,所有我们要掌握使用其他编程语言来调用我们写好的存储过程.下面我们介绍下使用java调用Oracle的存储过程.   准备代码: package com.mscncn.plsql.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DBUtil { s

java中发布一个webService服务到服务器

Java在编码完成webService服务端后,可以通过运行一个main方法来发布webService服务,但是实际将服务部署到服务器上后,肯定不能还运行main方法,所以我们需要在启动服务器的时候就发布服务.并且在服务器的生命周期内一直运行. main方法发布服务(可用于测试类) public static void main(String[] args) { Endpoint.publish("http://172.18.100.52:9090/medical", new Medi