本文已经同步发布到新博客:http://fengchenluoyu.duapp.com/
要调用已经发布的webservice服务,cxf有多种调用方式,现例举几种,留作参考!获取版本包和获取wsdl2java文件都可以通过官方网站apache cxf下载!
1、利用wadl2java生成客户端调用,此方法最符合面向对象原理!适用范围最广,只有wsdl文件,只拥有服务访问地址,不知道接口定义等都能够胜任。
首先生成客户端(window下生成):进入下载的cxf包的bin目录下,然后cmd到此目录下:
指令:
1
|
wsdl2java
-
p
com
.
zzzl
.
webservice
.
qidian
-
d
d
:
\
cxfoutput
\
-
all
(
wsdl文件名称,或者
wsdl访问路径
)
|
参数说明:
-p 也就是package 对应生成之后java文件中的包名称
-d 输入目录,生成.java文件会在该目录,会自动添加-p参数配置的包路径
-client 生成客户端测试web service的代码.
-server 生成服务器启动web service的代码.
-impl 生成web service的实现代码.
-ant 生成build.xml文件.
-all 生成上面-client -server -impl -ant 对应的所有文件.
生成之后 能够发现会在这个目录下生成一些*_client.java的文件,打开它,原来里面都是main方法,都给出示例了。这也是能够执行的方法,跑一下main写入正确的地址,能够访问到则表示调用成功了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
public
final
class
ThirdJoinPortType_ThirdJoinHttpEndpoint_Client
{
private
static
final
QName
SERVICE_NAME
=
new
QName
(
"http://ws.apache.org/axis2/services/SVCUserManager/"
,
"third_join"
)
;
private
ThirdJoinPortType_ThirdJoinHttpEndpoint_Client
(
)
{
}
public
static
void
main
(
String
args
[
]
)
throws
Exception
{
URL
wsdlURL
=
ThirdJoin
.
WSDL_LOCATION
;
if
(
args
.
length
>
0
)
{
File
wsdlFile
=
new
File
(
args
[
0
]
)
;
try
{
if
(
wsdlFile
.
exists
(
)
)
{
wsdlURL
=
wsdlFile
.
toURI
(
)
.
toURL
(
)
;
}
else
{
wsdlURL
=
new
URL
(
args
[
0
]
)
;
}
}
catch
(
MalformedURLException
e
)
{
e
.
printStackTrace
(
)
;
}
}
ThirdJoin
ss
=
new
ThirdJoin
(
wsdlURL
,
SERVICE_NAME
)
;
ThirdJoinPortType
port
=
ss
.
getThirdJoinHttpEndpoint
(
)
;
{
System
.
out
.
println
(
"Invoking receive..."
)
;
java
.
lang
.
String
_receive_xmlData
=
""
;
java
.
lang
.
String
_receive__return
=
port
.
receive
(
_receive_xmlData
)
;
System
.
out
.
println
(
"receive.result="
+
_receive__return
)
;
}
System
.
exit
(
0
)
;
}
}
|
2、动态生成客户端方式(JaxWsDynamicClientFactory),适用于有webservice访问地址,并且知道接口定义.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public
static
void
main
(
String
[
]
args
)
throws
Exception
{
//这个是用cxf 客户端访问cxf部署的webservice服务
//千万记住,访问cxf的webservice必须加上namespace ,否则通不过
JaxWsDynamicClientFactory
dcf
=
JaxWsDynamicClientFactory
.
newInstance
(
)
;
org
.
apache
.
cxf
.
endpoint
.
Client
client
=
dcf
.
createClient
(
"http://localhost:8080/facelook/services/facelookWebService?wsdl"
)
;
//url为调用webService的wsdl地址
QName
name
=
new
QName
(
"http://server.webservice.facelook.com/"
,
"getAlbumList"
)
;
//namespace是命名空间,methodName是方法名
String
xmlStr
=
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+
" <facelook>"
+
" <condition>"
+
" <name>家</name>"
+
" <description></description>"
+
" <pageno></pageno>"
+
" <pagesize></pagesize>"
+
" </condition>"
+
" </facelook>"
;
//paramvalue为参数值
Object
[
]
objects
=
client
.
invoke
(
name
,
xmlStr
)
;
//调用web Service//输出调用结果
System
.
out
.
println
(
objects
[
0
]
.
toString
(
)
)
;
}
|
说明:namespace 必须写上,获取位置为wsdl描叙文件 <wsdl:definitions 节点的 targetNamespace 属性值!
3、通过ClientProxyFactoryBean生成动态生成服务的方式,适用自己发布自己调用,需要知道class和url方式。
1
2
3
4
5
6
7
|
public
static
<T>
T
getService
(
String
url
,
Class
<T>
cls
)
{
ClientProxyFactoryBean
factory
=
new
ClientProxyFactoryBean
(
)
;
factory
.
setServiceClass
(
cls
)
;
factory
.
setAddress
(
url
)
;
T
service
=
(
T
)
factory
.
create
(
)
;
return
service
;
}
|
以上为常用到的3种调用方式,本人不才,如果还有请大家不吝赐教!谢谢!!