- 浏览: 257764 次
- 性别:
- 来自: 多伦多
文章分类
- 全部博客 (127)
- Java 基础 (46)
- Java EE (3)
- Clouds (1)
- Spring 编程 (7)
- Spring Batch 编程 (1)
- Quartz 编程 (9)
- Seam 编程 (4)
- Hibernate 编程 (1)
- JSF 编程 (3)
- jQuery 编程 (3)
- Interview Question 汇总 (3)
- 日常应用 (3)
- Maven 编程 (2)
- WebService 编程 (10)
- Scala 编程 (5)
- Coherence 编程 (8)
- OO 编程 (1)
- Java 线程 (6)
- DB 编程 (2)
- WebService 安全 (4)
- Oracle Fusion 编程 (2)
- JavsScript/Ajax 编程 (1)
最新评论
-
chainal:
赞,说的很好
Scala 有趣的Trait -
wuliupo:
RRRR-MM-DD HH24:MI:SS
如何让Oracle SQL Developer显示的包含在日期字段中的时间 -
pengain:
...
使用Spring Roo ,感受ROR式的开发 -
zeng1990:
def getPersonInfo() = {
(&quo ...
Java 的继位人? - Scala简介 -
zeng1990:
我使用的是2.9.2版本的!
Java 的继位人? - Scala简介
http://hanyexiaoxiao.iteye.com/blog/479194
这是AXIS学习笔记的最后一篇。在前面我们讨论了最简单的HelloWorld服务,客户端并没有向服务器端
传递参数,现在我们来传传JavaBean。当然,也可以传递你自己定义的JAVA类,但那样你必须自己创建
专门的XML序列化器和反序列化器;而对JavaBean,AXIS提供了现成的序列化器。(有人说:懒惰是程序员最大的美德,我喜欢,所以我就传传JavaBean)
一、服务器端
1、CLASS类两个Order.class,OrderTest.class,位于%TOMCAT_HOME%\webapps\axis\WEB-INF\classes下
这两个类都直接给出源码,不再说明
Order.java
public
class Order {
private String id;
private String name;
public void setId(String id){
this.id=id;
}
public String
getId(){
return id;
}
public void setName(String
name){
this.name=name;
}
public String
getName(){
return name;
}
}
OrderTest.java
public class OrderTest {
public Order returnOrder(Order order){
Order newOrder=new Order();
if(order.getId().equals("1"))
newOrder.setName("annlee");
else
newOrder.setName("leeann");
return newOrder;
}
}
2、修改服务器端配置文件server-config.wsdd
在server-config.wsdd中相应位置添加以下代码
<service
name="Order" provider="java:RPC">
<parameter name="allowedMethods"
value="returnOrder"/>
<parameter name="className"
value="OrderTest"/>
<beanMapping languageSpecificType="java:Order"
qname="ns1:Order"
xmlns:ns1="urn:BeanService"/>
</service>
可以看到和前面的发布服务代码相比仅多了一行代码
<beanMapping
languageSpecificType="java:Order" qname="ns1:Order"
xmlns:ns1="urn:BeanService"/>
languageSpecificType属性指定JavaBean类文件位置,例如:
languageSpecificType="java:com.annlee.axis.Order"
qname属性指定JavaBean类的名字
其他是固定的。
二、客户端
客户端类文件一个OrderClient.class,代码如下(变化的部分加注释):
public
class OrderClient
{
public static void main(String args[])
throws Exception
{
String endpoint = "http://localhost:8080/axis/services/Order"; //服务所在位置
Order order=new Order();
//JavaBean
order.setId("1");
Service service = new
Service();
Call call = (Call)service.createCall();
//注册JavaBean,注意和server-config.wsdd中的配置代码比较
QName qn = new
QName("urn:BeanService", "Order");
call.registerTypeMapping(Order.class,
qn, new BeanSerializerFactory(Order.class,
qn),
new
BeanDeserializerFactory(Order.class, qn));
String name="no!";
try
{
call.setTargetEndpointAddress(new
URL(endpoint));
//调用的服务器端方法
call.setOperationName(new
QName("Order", "returnOrder"));
//设定传入的参数,这里qn即Order.class
call.addParameter("arg1", qn, ParameterMode.IN);
//设定返回的参数是Order.class
call.setReturnType(qn, Order.class);
Order result = (Order)call.invoke(new Object[] {
order
});
if(result != null)
name = result.getName();
}
catch(Exception e)
{
System.err.println(e);
}
System.out.println(name);
}
}
OK!运行一下,就可以看到返回了"annlee"。
和上一篇文章一样,我们不容许在网络中传递XML是明文,于是需要加密和验证。这里我们继续采用上次所讲的框架。(已打包成ws-axis.jar)
一、修改服务器端配置文件server-config.wsdd(和上一文章一模一样!不再罗嗦)
在server-config.wsdd中相应位置添加以下代码
<requestFlow>
<handler type="soapmonitor"/>
<handler type="java:com.annlee.WSAxis.WSServerRequestHandler">
<parameter name="keyStoreFile" value="f:\server.keystore"/>
<parameter name="trustStoreFile" value="f:\server.truststore"/>
<parameter name="keyStorePassword" value="changeit"/>
<parameter name="keyAlias" value="Server"/>
<parameter
name="keyEntryPassword" value="changeit"/>
<parameter
name="trustStorePassword" value="changeit"/>
<parameter
name="certAlias" value="clientkey"/>
</handler>
</requestFlow>
<responseFlow>
<handler
type="soapmonitor"/>
<handler
type="java:com.annlee.WSAxis.WSServerResponseHandler">
<parameter name="keyStoreFile" value="f:\server.keystore"/>
<parameter name="trustStoreFile" value="f:\server.truststore"/>
<parameter name="keyStorePassword" value="changeit"/>
<parameter name="keyAlias" value="Server"/>
<parameter
name="keyEntryPassword" value="changeit"/>
<parameter
name="trustStorePassword" value="changeit"/>
<parameter
name="certAlias" value="clientkey"/>
</handler>
</responseFlow>
二、客户端(区别就在这里,注意!!)
客户端的编码我经过了三个阶段
第一阶段:
在这个阶段我想当然的在OrderClient.class中加入了如下代码:
WSClientHandler handler=new WSClientRequestHandler();//注意新加的HANDLER
handler.setInitialization("f:/client.keystore","changeit","Client","changeit",
"f:/client.truststore","changeit","serverkey");//初始化
WSClientHandler
handlee=new WSClientResponseHandler();//注意新加的HANDLER
handlee.setInitialization("f:/client.keystore","changeit","Client","changeit",
"f:/client.truststore","changeit","serverkey");//初始化
call.setClientHandlers(handler,handlee);//添加Handler
这个方法也是我在上一文章里介绍的,结果抛出以下异常:
faultString:
org.xml.sax.SAXException: Deserializing
parameter
'newProfileReturn': could not find deserializer
for type
{urn:BeanService
Order}SerializableProfile
也就是说不能正常解析XML文件,于是理所当然的郁闷了,觉得代码中肯定漏设了CALL的一个属性,于是查看AXIS的源代码,没有结果!转机出现在下面一行代码,在不断的抛出异常中我修改了代码
将call.setClientHandlers(handler,handlee);改为
call.setClientHandlers(null,null);
结果程序还是抛出同样的异常,于是意识到这可能是AXIS的一个BUG,为证明这一点,我将下面的Handler初始化代码删除
WSClientHandler handler=new WSClientRequestHandler();//注意新加的HANDLER
handler.setInitialization("f:/client.keystore","changeit","Client","changeit",
"f:/client.truststore","changeit","serverkey");//初始化
WSClientHandler
handlee=new WSClientResponseHandler();//注意新加的HANDLER
handlee.setInitialization("f:/client.keystore","changeit","Client","changeit",
"f:/client.truststore","changeit","serverkey");//初始化
结果还是抛出同样的异常,果然是BUG!得到这个结论后去了apache
AXIS主页,在问题列表中见到了完全一样问题的提交,但没有解答(晕!)
最后得到了结论:call的setClientHandlers()方法只有当call处理简单的数据类型,如String,int等等才能正常使用!
(当然,如果你对这个问题有不同的见解,欢迎和我联系。或许我错了,但程序不运行是真的:))
第二阶段:
开始在google上找问题的解决方法,这也是我的习惯:)。找了一个类似问题的讨论,地址如下:
http://marc.theaimsgroup.com/?l=axis-user&m=111259980822735&w=2
他们的解决方法是Handler继承于javax.xml.rpc.handler.Handler,然后在程序里动态注册而在我的ws-axis.jar里Handler继承于org.apache.axis.handlers.BasicHandler。当然,
javax.xml.rpc.handler.Handler是org.apache.axis.handlers.BasicHandler的老爸,但在程序里老爸和儿子之间却不能很好的兼容,这也许就是所谓的代沟??无奈中重新写了Handler,但在运行中却抛出异常,提示message在被invoke的时候已被更改。我靠,Handler的作用就是来更改message的啊!这是什么世道!
我知道很多程序采用的就是这种方法,但我好象怎么修改都抛出上述异常。
第三阶段
既然在程序里动态注册Handler行不通,于是决定写个单独的配置文件来注册Handler。如果这种方法不幸失败就返回第二阶段。好马为什么不吃回头草??
1、ws-axis.jar中修改WSClientHandler.class,修改后如下,我想你一看就明白为何修改
public class WSClientHandler extends
BasicHandler{
protected String keyStoreFile ;
protected String
keyStoreType ="JKS";
protected String keyStorePassword ;
protected String
keyAlias ;
protected String keyEntryPassword ;
protected String
trustStoreFile ;
protected String trustStoreType = "JKS";
protected String
trustStorePassword ;
protected String certAlias ;
public void init() {
keyStoreFile =
(String)getOption("keyStoreFile");
if(( keyStoreFile== null) )
System.err.println("Please keyStoreFile configured for the
Handler!");
trustStoreFile = (String)getOption("trustStoreFile");
if((
trustStoreFile== null) )
System.err.println("Please trustStoreFile configured
for the Handler!");
keyStorePassword =
(String)getOption("keyStorePassword");
if(( keyStorePassword== null)
)
System.err.println("Please keyStorePassword configured for the
Handler!");
keyAlias = (String)getOption("keyAlias");
if(( keyAlias==
null) )
System.err.println("Please keyAlias configured for the
Handler!");
keyEntryPassword = (String)getOption("keyEntryPassword");
if((
keyEntryPassword== null) )
System.err.println("Please keyEntryPassword
configured for the Handler!");
trustStorePassword =
(String)getOption("trustStorePassword");
if(( trustStorePassword== null)
)
System.err.println("Please trustStorePassword configured for the
Handler!");
certAlias = (String)getOption("certAlias");
if
((certAlias==null))
System.err.println("Please certAlias configured for
the Handler!");
if ((getOption("keyStoreType")) != null)
keyStoreType
= (String)getOption("keyStoreType");
if ((getOption("trustStoreType")) !=
null)
trustStoreType =
(String)getOption("trustStoreType");
}
public void invoke(MessageContext
messageContext) throws AxisFault {
//do nothing now!
}
public void
onFault(MessageContext msgContext) {
System.out.println("处理错误,这里忽略!");
}
}
2、写客户端的配置代码client-config.wsdd,如下:
<?xml version="1.0"
encoding="UTF-8"?>
<deployment name="defaultClientConfig"
xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java=""
target="_blank">http://xml.apache.org/axis/wsdd/providers/java">
<transport
name="http"
pivot="java:org.apache.axis.transport.http.HTTPSender"/>
<transport
name="local"
pivot="java:org.apache.axis.transport.local.LocalSender"/>
<transport
name="java"
pivot="java:org.apache.axis.transport.java.JavaSender"/>
<globalConfiguration>
<requestFlow>
<handler
type="java:com.annlee.WSAxis.WSClientRequestHandler">
<parameter
name="keyStoreFile"
value="D:\Tomcat5.5\webapps\axis\WEB-INF\client.keystore"/>
<parameter
name="keyEntryPassword" value="changeit"/>
<parameter name="certAlias"
value="serverkey"/>
<parameter name="trustStorePassword"
value="changeit"/>
<parameter name="trustStoreFile"
value="D:\Tomcat5.5\webapps\axis\WEB-INF\client.truststore"/>
<parameter
name="keyAlias" value="Client"/>
<parameter name="keyStorePassword"
value="changeit"/>
</handler>
</requestFlow>
<responseFlow>
<handler
type="java:com.annlee.WSAxis.WSClientResponseHandler">
<parameter
name="keyStoreFile"
value="D:\Tomcat5.5\webapps\axis\WEB-INF\client.keystore"/>
<parameter
name="keyEntryPassword" value="changeit"/>
<parameter name="certAlias"
value="serverkey"/>
<parameter name="trustStorePassword"
value="changeit"/>
<parameter name="trustStoreFile"
value="D:\Tomcat5.5\webapps\axis\WEB-INF\client.truststore"/>
<parameter
name="keyAlias" value="Client"/>
<parameter name="keyStorePassword"
value="changeit"/>
</handler>
</responseFlow>
</globalConfiguration>
</deployment>
同样不再解释,不明白可以参考我的上一篇文章
3、修改OrderClient.class
在OrderClient.class中加入了如下代码:
EngineConfiguration
conf =
new
FileProvider("F:\\Tomcat\\webapps\\axis\\WEB-INF\\client-config.wsdd");//位置
Service
service = new Service(conf);
当然记得导入
import
org.apache.axis.EngineConfiguration;
import
org.apache.axis.configuration.FileProvider;
运行一下,返回"annlee",靠,搞定!
注意:这次我把OrderClient.class的调用放到了一个JSP文件中而不是jbuilder中,因为有client-config.wsdd,所以你必须有完整的WEB程序发布到TOMCAT中,否则会报找不到相应文件。
发表评论
-
AXIS第四课:AXIS高级应用,建立安全的AXIS服务
2010-11-25 08:07 1412http://hanyexiaoxiao.iteye ... -
AXIS第三课:AXIS高级应用,使用Handler来增强web服务的功能
2010-11-25 08:06 1117http://hanyexiaoxiao.iteye ... -
AXIS第二课:工程应用中的AXIS发布方法
2010-11-25 08:05 1247http://hanyexiaoxiao.iteye ... -
AXIS第一课:最简单的AXIS发布webservice
2010-11-25 08:05 1636http://hanyexiaoxiao.iteye ... -
Axis2 WS-Security 基础
2010-11-25 08:04 3897(From: http://reeboo.iteye ... -
wss4j和axis2实现WS-Security
2010-11-25 08:02 1277一、wss4j简介 Wss4j是apache开 ... -
AXIS2中OMElement和Java对象之间的转换 分享
2010-11-25 08:01 1160转自 http://hanyexiaoxiao.itey ... -
Handler and Phase in Apache Axis2
2010-11-25 06:31 1584转自 http://www.packtpub.com ... -
设计与开发 JAX-WS 2.0 Web 服务
2010-11-25 06:29 1155转自 http://www.ibm.co ...
相关推荐
1.1 AXIS第一课:最简单的发布AXIS的Web Service 1.2 AXIS第二课:工程应用中的AXIS的发布方法Stub...1.5 AXIS第五课:AXIS高级应用,在AXIS服务间传递JavaBean及其安全解决 1.6 使用TCPMonitor监控WebService SOAP消息
WebService之AXIS传递javabean
NULL 博文链接:https://yehao0716.iteye.com/blog/1542231
最简单的发布AXIS的Web Service 工程应用中的AXIS的发布方法Stub AXIS高级应用,使用Handler来增强Web服务的功能 ...AXIS高级应用,在AXIS服务间传递JavaBean及其安全解决 使用TCPMonitor监控WebService SOAP消息
axis1 对象传输 多文件传输 javaBean传输 良心资源 学习axis1的学生少走弯路 ,传输复杂对象时 普通javaBean需要 序列化转换,传流文件时需要类型转换,如有报错可能是mail的jar与javaee的mail冲突。
Axis是第三代Apache SOAP,从2000年起,SOAP v2开发小组开始讨论如何让Axis更加灵活、可配置,以及能够处理SOAP和来自W3C的各种XML标准。通过不断地讨论和代码编写,Axis目前取得了如下成果: 速度提高。 Axis通过...
2):复合类型数据的传递 3):使用services.xml文件发布WebService 4):二进制文件传输 5):会话(Session)管理 6):跨服务会话(Session)管理 7):将Spring的装配JavaBean发布成 8):异步调用WebService 9):编写...
Axis的简单准备 Axis的入门实例 Axis复杂对象类型的WebService ...Axis用Spring的JavaBean发布WebService Axis异步调用WebService Axis 的Module模块 Axis使用SoapMonitar监视WebService的请求和响应信息
Axis 的简单准备 Axis 的入门实例 Axis 复杂对象类型的WebService ...Axis 用Spring 的JavaBean 发布WebService Axis 异步调用WebService Axis 的Module 模块 Axis 使用SoapMonitar 监视WebService 的请求和响应信息
1 如何发布自己的webService 2 1.1 即时发布 JWS (Java Web Service) Files - Instant Deployment 2 1.2 定制发布 Custom Deployment - Introducing WSDD 4 2 WSDD的一些高级特性 7 ...5 如何传递文件 25
WebService大讲堂之Axis2系列教程 1. 用POJO实现0配置的WebService 2. 复合类型数据的传递 3. 使用services.xml文件发布WebService 4. 二进制文件传输 5. 会话(Session)管理 6. 跨服务会话(Session)管理 ...
复合类型数据的传递 3. 使用services.xml文件发布WebService 4. 二进制文件传输 5. 会话(Session)管理 6. 跨服务会话(Session)管理 7. 将Spring的装配JavaBean发布成WebService 8. 异步调用WebService 9. ...
Axis的简单准备 Axis的入门实例 Axis复杂对象类型的WebService ...Axis用Spring的JavaBean发布WebService Axis异步调用WebService Axis的Module模块 Axis使用SoapMonitar监视WebService的请求和响应信息
Axis的简单准备 Axis的入门实例 Axis复杂对象类型的WebService ... Axis用Spring的JavaBean发布WebService Axis异步调用WebService Axis 的Module模块 Axis使用SoapMonitor监视WebService的请求和响应信息
WebService大讲堂之Axis2(2):复合类型数据的传递 ....................................................................................... 9 一、实现服务端代码 .............................................
2.1. Axis2下载,并部署axis2到Tomcat 7 2.2. Eclipse下安装Axis2插件 8 2.2.1. 下载axis2的eclipse插件 8 3. 编写Web service程序 10 3.1. Axis2的简单WebService示例 10 3.1.1. 0配置POJO的Webservice 10 3.1.2. ...
第5章 使用Java Servlet开发动态网页 65 5.1 Servlet的概念和生命周期 65 5.2 如何编写Servlet 67 5.3 使用Eclipse和Tomcat开发Servlet实例——输出字符串响应 72 5.4 小结 77 第6章 JSP——前后台更好地...
笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!此时此...
简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!...