java代码调用使用cxf搭建的webService服务传递对象

前边成功创建好一个cxf的webServcie服务,并带了一个无参数的方法。现在进一步尝试了使用带参数的方法,分别测了用String为参数和用自定义的对象为参数。

其中,使用String为参数时和不带参数的写法没有什么区别,调用时也就是很普通的调用。但是调用自定义对象为参数的方法时,实际数据并没有传递成功,于是在网上搜索一番后找到了解决办法,成功实现这一功能。

具体实现步骤大致如下:

1、在服务项目中添加一个自定义的类:

package models;
public class UserModel {

    public UserModel() {
        super();
    }

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

    /**
     * 姓名
     */
    private String name;

    /**
     * 年龄
     */
    private int age;

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

2、服务中添加一个方法:

public UserModel addUser(@WebParam(name = "user") UserModel user);

3、该方法的实现:

/**
     * 自定义对象为参数
     *
     * @author:tuzongxun
     * @Title: addUser
     * @Description: TODO
     * @param @param user
     * @param @return
     * @date Jun 12, 2016 9:28:38 AM
     * @throws
     */
    @Override
    public UserModel addUser(UserModel user) {
        System.out.println(user);
        return user;
    }

4、在模拟客户端的项目中也同时添加包名路径相同的自定义UserModel类(因为之前在xfire上,因包名路径不同的问题被坑过,因此这里直接就这样写了,便没有去测是不是也必须相同),在相关的service中添加和服务中一样的方法(代码略过);

5、在模拟客户端的main方法中调用,和之前的写法一样,只是改个调用的方法:

package cxfTest1;
import models.UserModel;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;

public class CxfTest {

    public static void main(String[] args) {
        JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();
        // factoryBean.getInInterceptors().add(new LoggingInInterceptor());
        // factoryBean.getOutInterceptors().add(new LoggingOutInterceptor());
        factoryBean.setServiceClass(CxfTestService.class);
        factoryBean
                .setAddress("http://localhost:8082/cxfTest/services/CxfTestService");
        CxfTestService impl = (CxfTestService) factoryBean.create();
        // System.out.println(impl.getUserName());
        // System.out.println(impl.addUserName("hello"));
        System.out.println(impl.addUser(new UserModel("uName", 23)));

    }
}

6、结果打印出来的如图,数据传递实际是失败的:

7、之后在网上查找资料后找到解决办法,在自定义类上加上一些注解后,成功传递和返回自定义对象的数据,修改后的自定义对象如下:

package models;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlRootElement(name = "UserModel")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = { "name", "age" })
public class UserModel {

    public UserModel() {
        super();
    }

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

    /**
     * 姓名
     */
    private String name;

    /**
     * 年龄
     */
    private int age;

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

}

8、再次在main中调用后,控制台打印如图:

9、上边的注解相关的解释如下:

@XmlRootElement-指定XML根元素名称(可选) 

@XmlAccessorType-控制属性或方法序列化 

四种方案: 

FIELD-对每个非静态,非瞬变属性JAXB工具自动绑定成XML,除非注明XmlTransient 

NONE-不做任何处理 

PROPERTY-对具有set/get方法的属性进行绑定,除非注明XmlTransient 

PUBLIC_MEMBER -对有set/get方法的属性或具有共公访问权限的属性进行绑定,除非注 

明XmlTransient 

@XmlType-映射一个类或一个枚举类型成一个XML Schema类型 

10、参考:http://hbiao68.iteye.com/blog/2044252

时间: 2024-08-03 19:49:12

java代码调用使用cxf搭建的webService服务传递对象的相关文章

android 中 如何通过java代码调用style样式

问题描述 android 中 如何通过java代码调用style样式 平时做开发,通常style样式直接在xml布局文件中直接调用,如果我想直接在java代码中通过动态加载来设置,是否可以?通过查阅资料,很多说不可以,解决方式是把style中的逐条信息加载设置,还有其他途径可以设置吗? 解决方案 无其他方式无其他方式无其他方式 解决方案二: 我们之前的一个项目也尝试过在java里面动态加载style,最后也放弃了,这个确实做不到,楼主想想其它方法吧 解决方案三: 多谢,各位,目前我没有发现动态加

关于java代码调用页面中javascript代码

问题描述 关于java代码调用页面中javascript代码,如何调用,这方面的参考资料,各位能否推荐下?... 解决方案 解决方案二:为什么要调用页面中的那些代码?如果你把层次分的很清楚,就不存在这些问题.解决方案三:有的时候,实现一个功能,javascript更方便,java代码只要调用一下就可以,解决方案四:importnetscape.javascript.JSObject;JSObjectwindow=null;window=JSObject.getWindow(this);windo

java代码调用oracle存储过程

原文:java代码调用oracle存储过程 一.简介 与调用mysql存储过程类型过程都是如下 1.创建连接 Connection conn = DriverManager.getConnection(url, user, password); 2.创建CallableStatement CallableStatement statement = conn.prepareCall(sql); 3.设置参数 statement.setInt(1, id); statement.registerOu

图片-请问:用java代码调用memcached的启动,为何memcached没有反应?谢谢!

问题描述 请问:用java代码调用memcached的启动,为何memcached没有反应?谢谢! 解决方案 你的命令不正确,使用 String cmdStr = "F:/memcached_en32or64/x64/memcached.exe –d start"; 具体命令如下: C:memcached>memcached.exe -h memcached 1.2.6 -p TCP port number to listen on (default: 11211) -U UDP

Java Axis2 的 RPC 方式调用 webservice 接口 传递对象参数 服务器端接收参数值为NULL

问题描述 JavaAxis2的RPC方式调用webservice接口传递对象参数(其他形式的参数没有试过)时,服务器端可接收到访问,但参数值为null.请问大家有没有遇到过这样的问题,又是怎么解决的??? 解决方案 解决方案二:对方的webservice是document风格的吗?

webservice-ttuscany搭建的webService 服务端接收复杂参数

问题描述 ttuscany搭建的webService 服务端接收复杂参数 用tuscany 搭建的webService 服务端怎么接收一个复杂类型,比如jabaBean,对象数组之类的参数

axis webservice接口传递对象形式报文获取

问题描述 axiswebservice接口传递对象形式,报文怎么获取,需要将req和res的xml报文存入数据库日志表中,怎么用代码获取具体的报文.报文很复杂,手工拼接成xml太麻烦.知道可以用自定义handler拦截取得报文,但是request和response拦截是在不同的handler中,有啥方法能实现吗,服务端和客户端都需要req和res存日志. 解决方案

02_JNI中Java代码调用C代码,Android中使用log库打印日志,javah命令的使用,Android.mk文件的编写,交叉编译

 1  编写以下案例(下面的三个按钮都调用了底层的C语言): 项目案例的代码结构如下: 2 编写DataProvider的代码: package com.example.ndkpassdata;   public class DataProvider {         /**      * 计算x和y的加法  apktools      *      * @param x      * @param y      * @return      */     public native in

java代码调用应用程序exe问题

问题描述 在windows下能调用成功,部署上linux系统上却失败(就是只打印出了A句,B,C都不出来,按道理B和C应该打印出其中一句的),怎么回事呢?代码如下:System.out.println(cmd);try{pro=Runtime.getRuntime().exec(cmd);br=newBufferedReader(newInputStreamReader(pro.getInputStream()));System.out.println("A.调用了命令啦"+br.to