在 java 中使用 web-service 时如何触发处理程序 class
How to trigger a handler class when consuming web-service in java
使用 Axis 1.4
我构建了将使用外部服务器服务的客户端应用程序。
服务器应用程序响应包含 header 标记和 body 标记的 soap 消息。
我的 header 标签有问题,我正在尝试找到 header
元素。
目前完成的内容:
我发现我需要使用扩展 BasicHandler
的处理程序,使用此 class 我可以获得 header 标记。来源:Dealing with SOAP Headers in Axis
但是如何让这个处理程序在消费时工作web-service?我的意思是当我 从服务器接收 响应以获取其 header
.
时如何调用此处理程序
一些博客建议我需要使用 .wsdd
文件。我在 weblogic 10.3.6 环境中使用 Jdeveloper 11g,我只知道 web.xml
配置文件。
问题:如何link那些信息(处理程序class,.wsdd
文件和web.xml
)收集和让处理程序工作以获取 header 标签?
最好的开始是查看 Axis 指南:Apache-Axis Reference Guide 您将在其中大致了解工作流程。
要将处理程序配置为从客户端触发,您需要执行以下操作:
1- 创建处理程序 class 基本上类似于以下内容:
package mypackge;
import javax.xml.soap.SOAPException;
import org.apache.axis.AxisFault;
import org.apache.axis.MessageContext;
import org.apache.axis.handlers.BasicHandler;
import org.apache.axis.message.SOAPHeader;
import org.apache.axis.message.SOAPHeaderElement;
public class SoapHeaderConsumerHandler
extends BasicHandler
{
public void invoke(MessageContext messageContext)
throws AxisFault
{
// Your logic for request or response handling goes here.
// Basically you need to make use of the parameter
// messageContext where you can access the soap header and body tags.
}
}
2- 创建 client-config.wsdd
文件。它将如下所示:
<deployment
xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<globalConfiguration>
<responseFlow>
<handler name="log" type="java:mypackge.SoapHeaderConsumerHandler"/>
</responseFlow>
</globalConfiguration>
<transport name="http" pivot="java:org.apache.axis.transport.http.HTTPSender"/>
</deployment>
您可以看到我只对来自服务器端的传入响应使用处理程序。因此,每当客户端应用程序收到来自服务器的响应时,将触发处理程序 class SoapHeaderConsumerHandler
并且默认情况下将调用方法 invoke 。
注意: 如果你想在发送到服务器之前访问传出请求,你需要为 <requestFlow>
添加额外的标签以添加请求处理程序。
检查Deployment(WSDD) Reference from Axis guide:
3- client-config.wsdd
文件放在哪里?
您应该将 .wsdd
文件放在工作目录中。您可以使用 :
轻松找到工作目录位置
System.out.println("Working Directory = " + System.getProperty("user.dir"));
来源: Getting the Current Working Directory in Java
更新:
我发现没必要把client-config.wsdd
文件放在工作目录下。您可以在代码中指定此文件的路径,如下所示:
System.setProperty("axis.ClientConfigFile", "[Path goes here]\client-config.wsdd");
您只需要将 .wsdd
文件放在那里。
额外有用的链接:
Where to place the client-config.wsdd file in Railo
V Axis handler这是服务器端处理程序的示例。
为避免文件位置问题,您可以以编程方式配置轴:
ConsultationServiceLocator stub = new ConsultationServiceLocator();
SimpleProvider clientConfig = new SimpleProvider();
SoapHeaderConsumerHandler logHandler = new SoapHeaderConsumerHandler();
SimpleChain reqHandler = new SimpleChain();
SimpleChain respHandler = new SimpleChain();
reqHandler.addHandler(logHandler);
respHandler.addHandler(logHandler);
Handler pivot = new HTTPSender();
Handler transport = new SimpleTargetedChain(reqHandler, pivot, respHandler);
clientConfig.deployTransport(HTTPTransport.DEFAULT_TRANSPORT_NAME, transport);
使用 Axis 1.4
我构建了将使用外部服务器服务的客户端应用程序。
服务器应用程序响应包含 header 标记和 body 标记的 soap 消息。
我的 header 标签有问题,我正在尝试找到 header
元素。
目前完成的内容:
我发现我需要使用扩展 BasicHandler
的处理程序,使用此 class 我可以获得 header 标记。来源:Dealing with SOAP Headers in Axis
但是如何让这个处理程序在消费时工作web-service?我的意思是当我 从服务器接收 响应以获取其 header
.
一些博客建议我需要使用 .wsdd
文件。我在 weblogic 10.3.6 环境中使用 Jdeveloper 11g,我只知道 web.xml
配置文件。
问题:如何link那些信息(处理程序class,.wsdd
文件和web.xml
)收集和让处理程序工作以获取 header 标签?
最好的开始是查看 Axis 指南:Apache-Axis Reference Guide 您将在其中大致了解工作流程。
要将处理程序配置为从客户端触发,您需要执行以下操作:
1- 创建处理程序 class 基本上类似于以下内容:
package mypackge;
import javax.xml.soap.SOAPException;
import org.apache.axis.AxisFault;
import org.apache.axis.MessageContext;
import org.apache.axis.handlers.BasicHandler;
import org.apache.axis.message.SOAPHeader;
import org.apache.axis.message.SOAPHeaderElement;
public class SoapHeaderConsumerHandler
extends BasicHandler
{
public void invoke(MessageContext messageContext)
throws AxisFault
{
// Your logic for request or response handling goes here.
// Basically you need to make use of the parameter
// messageContext where you can access the soap header and body tags.
}
}
2- 创建 client-config.wsdd
文件。它将如下所示:
<deployment
xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<globalConfiguration>
<responseFlow>
<handler name="log" type="java:mypackge.SoapHeaderConsumerHandler"/>
</responseFlow>
</globalConfiguration>
<transport name="http" pivot="java:org.apache.axis.transport.http.HTTPSender"/>
</deployment>
您可以看到我只对来自服务器端的传入响应使用处理程序。因此,每当客户端应用程序收到来自服务器的响应时,将触发处理程序 class SoapHeaderConsumerHandler
并且默认情况下将调用方法 invoke 。
注意: 如果你想在发送到服务器之前访问传出请求,你需要为 <requestFlow>
添加额外的标签以添加请求处理程序。
检查Deployment(WSDD) Reference from Axis guide:
3- client-config.wsdd
文件放在哪里?
您应该将 .wsdd
文件放在工作目录中。您可以使用 :
System.out.println("Working Directory = " + System.getProperty("user.dir"));
来源: Getting the Current Working Directory in Java
更新:
我发现没必要把client-config.wsdd
文件放在工作目录下。您可以在代码中指定此文件的路径,如下所示:
System.setProperty("axis.ClientConfigFile", "[Path goes here]\client-config.wsdd");
您只需要将 .wsdd
文件放在那里。
额外有用的链接:
Where to place the client-config.wsdd file in Railo
V Axis handler这是服务器端处理程序的示例。
为避免文件位置问题,您可以以编程方式配置轴:
ConsultationServiceLocator stub = new ConsultationServiceLocator();
SimpleProvider clientConfig = new SimpleProvider();
SoapHeaderConsumerHandler logHandler = new SoapHeaderConsumerHandler();
SimpleChain reqHandler = new SimpleChain();
SimpleChain respHandler = new SimpleChain();
reqHandler.addHandler(logHandler);
respHandler.addHandler(logHandler);
Handler pivot = new HTTPSender();
Handler transport = new SimpleTargetedChain(reqHandler, pivot, respHandler);
clientConfig.deployTransport(HTTPTransport.DEFAULT_TRANSPORT_NAME, transport);