使用CXF时服务端接收到的参数值为null

本文关键字:使用  服务  配置  方法  参数  错误  访问  问题  发布 


环境说明:cxf的版本为cxf-2.1.4,spring版本为2.5

使用CXF来访问webservice时,服务端接收到的参数值为null,以下两种原因会造成这一状况

(一)发布方式和客户端访问代理方式不匹配
服务发布的方式和客户端访问代理的方式不匹配就会出现调用不到服务或者能调用到服务但是接收到的参数值为NULL的情况。

一般使用simple或jax-ws的方式来发布
使用simple的方式来发布时,示例代码:

ClientProxyFactoryBean factory2 = new ClientProxyFactoryBean();
factory2.setServiceClass(Iwbjk.class);
factory2.setAddress("http://192.10.110.80:8080/NewFrame/services/Wbjk");
Iwbjk wx = (Iwbjk) factory2.create();
wx.sendMessageImmediately("222222222", "3333333333");

使用jax-ws的方式来发布,代码和上面一样,把ClientProxyFactoryBean换成JaxWsProxyFactoryBean即可。
另外,有时候使用了simple的方式来发布服务,使用JaxWsProxyFactoryBean生成代理也是可以访问的,但是需要你指定的接口类中必须使用了 @webservice 注解。虽然可以这么做,但是不建议这么做,用相匹配的方式来访问webservice可以避免使用过程中发生诡异的问题。
更多代理访问方法可以参考CXF官网


(二)错误的服务发布配置

错误的发布配置也会导致接受到的参数值为null,比如servicename,endpointName属性没有按照要求的格式 ns:format

解决方法:
1)修改你的配置
  修改配置是最简单的方法,但是如果是别人的系统不允许你修改配置,你还可以尝试下面的方法。

2)如果你使用了错误的配置但是你不能改
尝试使用qname,指定服务命名空间后再调用

ClientProxyFactoryBean factory2 = new ClientProxyFactoryBean();
factory2.setServiceClass(Iwbjk.class);
QName qname = new QName("http://www.springframework.org/schema/beans","Wbjk");
factory2.setServiceName(qname);
factory2.setAddress("http://192.10.110.80:8080/NewFrame/services/Wbjk");
Iwbjk wx = (Iwbjk) factory2.create();
String res = wx.sendMessageImmediately("222222222", "3333333333");

QName构造器需要的两个参数可以通过wsdl来知晓,见下图中标红的部分:

使用CXF时服务端接收到的参数值为null

【附上一个诡异的问题】同样错误的配置,为什么有的可以访问,有的不可以?
在发布一个服务时使用了错误的配置,像下面的配置这样,指定endpointName和serviceName时没有按照官方要求的格式去做(ns:xxxxx)
由于配置错误导致访问服务方法sendMessageImmediately时接收到的参数值总是为null,但是诡异的其它的webservice也是这样配置的,却没有这样的错误。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:simple="http://cxf.apache.org/simple"
	xmlns:soap="http://cxf.apache.org/bindings/soap"
	xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://cxf.apache.org/bindings/soap http://cxf.apache.org/schemas/configuration/soap.xsd
http://cxf.apache.org/simple http://cxf.apache.org/schemas/simple.xsd">

	<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" />


	<simple:server id="pojoservice"  serviceBean="#WbjkWS" serviceClass="com.wisoft.framework.ams.ws.Iwbjk"  
	               address="/Wbjk" endpointName="Wbjk" serviceName="Wbjk">
        </simple:server>
	<bean id="WbjkWS" class="com.wisoft.framework.ams.ws.WbjkWS"
		abstract="false" lazy-init="default" autowire="default" 
		dependency-check="default">
	</bean>
</beans>
另外附上这个服务类的接口

public  interface Iwbjk {
	public String sendMessageImmediately(String destNumber, String content);
}

“同样”的配置,有的好,有的坏,遇到这样的问题,当然使用“比较法”了(何谓比较法可以参见:

,最后花了好长时间发现那些可以正常使用的服务类中方法有返回复杂对象类型的而Iwbjk中只有一个返回String的方法,难道是返回值的问题?改成下面这样之后果然可以正常接收参数了。

public  interface Iwbjk {
	public BaseReturn sendMessageImmediately(String destNumber, String content);
}

那么为什么要有复杂对象类型参数才行?这个错误的问题还要不要继续深究?
如果像上面这样配置错误,我认为项目忙的情况下没有必要深究,配置都错了,错误的现象往往会多种多样,你很难想的通,除非愿意去看源码。
从解决问题的角度,这让我们更加丰富了“比较法”的使用经验,至少以后知道方法返回值类型也是一个需要关注的点。




扩展:

Linux的Shell Script学习

什么是 Shell scripts ?shell script 是利用 shell 的功能所写的一个『程序 (program)』,这个程序是使用纯文字文件,将一些 shell 的语法与指令写在里面, 搭配正规表示法、管线命令与数据流重导向等功能,以达到我们所想要的处理目的。shell script 更提供数组、循环、条件与逻辑判断等重要功能,让使用者也可以直接以 shell 来撰写程序,而不必使用类似 C 程序语言等传统程序撰写的语法呢!shell script 可以简单的被看成是......

Caffe的Solver参数设置

http://caffe.berkeleyvision.org/tutorial/solver.html solver是通过协调前向-反向传播的参数更新来控制参数优化的。一个模型的学习是通过Solver来监督优化和参数更新,以及通过Net来产生loss和梯度完成的。 Caffe提供的优化方法有:Stochastic Gradient Descent (type: “SGD”),AdaDelta (type: “AdaDelta”),Adaptive Gradient (typ......

几种使用了CNN(卷积神经网络)的文本分类模型

谈到文本分类,就不得不谈谈CNN(Convolutional Neural Networks)。这个经典的结构在文本分类中取得了不俗的结果,而运用在这里的卷积可以分为1d 、2d甚至是3d的。 下面就列举了几篇运用CNN进行文本分类的论文作为总结。1 yoon kim 的《Convolutional Neural Networks for Sentence Classification》。(2014 Emnlp会议) 他用的结构比较简单,就是使用长度不同的 filter 对文本矩阵进行卷积,fi......

几种使用了CNN(卷积神经网络)的文本分类模型

谈到文本分类,就不得不谈谈CNN(Convolutional Neural Networks)。这个经典的结构在文本分类中取得了不俗的结果,而运用在这里的卷积可以分为1d 、2d甚至是3d的。 下面就列举了几篇运用CNN进行文本分类的论文作为总结。1 yoon kim 的《Convolutional Neural Networks for Sentence Classification》。(2014 Emnlp会议) 他用的结构比较简单,就是使用长度不同的 filter 对文......

几种使用了CNN(卷积神经网络)的文本分类模型

谈到文本分类,就不得不谈谈CNN(Convolutional Neural Networks)。这个经典的结构在文本分类中取得了不俗的结果,而运用在这里的卷积可以分为1d 、2d甚至是3d的。下面就列举了几篇运用CNN进行文本分类的论文作为总结。1 yoon kim 的《Convolutional Neural Networks for Sentence Classification》。(2014 Emnlp会议) 他用的结构比较简单,就是使用长度不同的 filter 对文本矩阵进行卷积,fil......

C++学习之路(18)---C++中的内联函数inline总结

突然看到C++Primer中讲到,对于vector的一个循环,调用语句:(示例代码i=v.begin()不是很规范,虽然不会出错,客官请将就着看)[cpp] view plain copyfor (int i=v.begin() ; i<v.size() ; i++)  {      ....&nbs......

使用内容提供器跨应用分享你的数据(1)

这是作者在android的学习旅途上具有历史性意义的一刻,因为四大组件就剩这一个了,从刚开始的写写样例,到现在已经养成了查看源代码的习惯,从以前android都会拼写错误,到现在开始有了自己的技术博客,这一路的成长真是不易。接下来了解一下四大组件的1/4,contentProvider适用于跨应用读取数据,比如在荷包app中自动填写短信验证码,免去输入的烦恼。其实内容提供器的内部封装了一个SQlite数据库,该类的接口原理就是访问权限,你这个可以用,那个应用不给用。 下面贴出基本工作原理关于在......

前端工作流程自动化——Grunt/Gulp 自动化

前端工作流程自动化——Grunt/Gulp 自动化  Grunt/Gulp 都是node.js下的模块,简单来说是自动化任务运行器,两者都有社区及大量的插件支撑,在所有的自动化工具领域里,这两者是最好的前端自动化构建工具。  那么问题来了,Grunt和Gulp到底哪家强?在回答这个问题前,先给大家看一组下面的数据:  再看看实现同样功能的配置代码:  作者本人之前一直使用Grunt来做自动化构建的,在Gulp出来后,经过一段时间的试用感觉配置比Grunt方便多了,如果你两者还没接触过,本人推荐直......

Angular-JS 与 Angular4 初接触

引入    突然想写下些什么来作为今天的点缀,第一次知道2^10是10月24日程序员节日。还有半个月就要软考啦!小小激动,用我青涩的文字来记录路上的点滴故事,下面进入主题喽~   最近有幸加入了新的项目,需要学习关于前端框架的知识,让我们来想想平时都有听说过哪些相关内容呢? MVC 、Vue、React……    小编不禁对自己发问一个前端框架为什么会有这么多类型呢,难道每个程序员都会设计一个适合自己的口味嘛?这应该不会是主要原因,在学习了几天的Angular之后我对于这个问题有了一个自己的认......

Mac下使用自带终端SSH功能的一个小技巧

在Mac OS的终端(terminal)中,可以使用命令ssh user@host的命令来远程连接一台服务器,但是,如果要管理的服务器太多,IP地址不能全部记住的时候怎么办?这时候我们可以为每一台服务器设置一个别名(alias),使用vi命令编辑一下~/.ssh/config这个文件(如果目录下没有这个文件,可以新建一个),接着按下面格式添加内容:# 服务器1Host 别名 HostName IP地址 Port 22 User 用户名# 服务器2Host 别名 HostN......

在Android中使用正确的姿势写一个string.xml

首先,本文用于记录Android中琐碎的string.xml声明。不要复用 不要复用同一个string。1.假如你在登陆和注册界面都用了一个Dialog来提示处理中,我们需要再string.xml中声明—R.string.loading.并把这个string应用到各自的Dialog中去。<string name="loading">Loading please wait...</string>版本发布之后产品经理说这样提示不太友好,登陆应该是“Sign in…”,注册才应......

使用RxJava实现的超简单事件总线RxBus

项目中加入了RxJava,所有很有必要把Eventbus给替换掉了,引用使用RxBus完全满足了需求了。而且RxBus实现起来超简单只需要几行代码就好了而且同一使用RxJava来取消绑定,我们可以忽视了Eventbus的unregister的过程,当然我们还是需要在界面结束的时候取消Observable间的订阅关系。直接给我RxBus源码public class RxBus { private final Subject<Object, Object> _bus = new S......

Java Socket(六) 使用多线程实现多客户端的通信

问题一个服务端可以跟多个客户端通讯基本步骤1.服务器端创建ServerSocket方法,循环调用accept()方法等待客户端连接2.客户端创建socket和服务的请求连接3.服务端接受客户端的请求,建立专线连接4.建立连接的两个socket在一个单独的线程上对话5.服务器端继续等待新的连接创建一个服务器相关的线程类:package com.test;/** * Created by SuPhoebe on 2015/12/27. * 服务器线程处理类 */import java.io.Buff......

给最真的自己加上static final

第一篇:勿忘初心,继续coding第二篇:编程路上,送给处于迷茫中的你和自己第三篇:编程路上,对于迷失者的一些小小建议第四篇:如果不从事编程,我可以做什么?第五篇:给最真的自己加上static final有时候改变,并不一定是成长,给最真的自己加上static final属性,保留一点最真实的自己。前段时间,技术交流群里的一个好基友波哥,彻底抛弃Android转向javaEE的怀抱,做得很彻底,直接删了所有的Android资料,很有一种破釜沉舟之势,很欣赏这种方式。回想了下,类似这种事情,我以前......

最简单的基于FFMPEG的Helloworld程序

=====================================================最简单的基于FFmpeg的视频播放器系列文章列表:100行代码实现最简单的基于FFMPEG+SDL的视频播放器(SDL1.x)最简单的基于FFMPEG+SDL的视频播放器 ver2 (采用SDL2.0)最简单的基于FFmpeg的解码器-纯净版(不包含libavformat)最简单的基于FFMPEG+SDL的视频播放器:拆分-解码器和播放器最简单的基于FFMPEG的Helloworld程序==......

Yii2 Model的一些常用rules规则

提示:打印出Validator::$builtInValidators可以看到被支持的所有validators去除首尾空白字符['email', 'trim']或['email', 'filter', 'filter' => 'trim']字段必填['email', 'required']赋予默认值['age', 'default', 'value' => 18]字符串长度['email', 'string', 'min' => 3, 'max' => 20]或['ema......

使用lua CJSON库如何将空table编码成数组

先看下面一段代码 local cjson = require "cjson" print(cjson.encode({dogs = {}})) -- 输出 {"dogs":{}} lua的CJSON库默认会将空table编码成{},如果dogs是一个数组呢?当dogs为空的时候,如何让它返回一个空数组?很简单,加多一句代码就可以了 local cjson = require "cjson" cjson.encode_empty_table_as_object(false) print(cj......

Linux常用命令详解(四)_文件过滤分割、统计、kill

grepgrep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。格式:grep [option] pattern file选项:-a 不要忽略二进制数据。 -A<显示列数> 除了显示符合范本样式的那一行之外,并显示该行之后的内容。 -b 在显示符合范本样式的那一行之外,并显示该行之前的内容。 -c 计算......

JS利用apply方法,将数组直接当做参数传给函数

利用apply()方法。语法:apply([thisObj[,argArray]]) 定义:应用某一对象的一个方法,用另一个对象替换当前对象。 说明: 如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。 比如求一个数组[1,2,3,4,5]的最大值可以写:let arr = [1,2,3,4,5];Math.max.apply(null, arr);这里使用函数调用apply方法......

linux的crontab定时服务备份mysql数据

利用Linux的crontab定时服务备份mysql数据。一、库文件备份库文件备份,我建议一周一次(当然,我的项目规模一般,然后至于怎么一周一次,稍候我们再聊了)#!/bin/bashdate_now=`date +%Y_%m_%d_%H%M%S`mysqldump -uroot -plixiaoli --flush-logs --master-data=2 maweiqing>/home/backup/${date_now}.sql &&zip -r /home/back......