Axis2 自定义 module 实现 handler 来log soap request and response Message

本文详细介绍如何为Apache Axis2自定义模块(Module),包括配置文件module.xml的编写、Module类的实现、Handler类的设计,以及如何打包部署并启用自定义模块。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[b]自定义Module[/b]
[b]1.给module写一个单独的配置文件(module.xml),放在source 同目录下的META-INF 文件中[/b]

<module name="logging" class="com.bank.webservice.LoggingModule">
<InFlow>
<handler name="InFlowLogHandler" class="com.bank.webservice.LogHandler">
<order phase="loggingPhase"/>
</handler>
</InFlow>
<OutFlow>
<handler name="OutFlowLogHandler" class="com.bank.webservice.LogHandler">
<order phase="loggingPhase"/>
</handler>
</OutFlow>

<OutFaultFlow>
<handler name="FaultOutFlowLogHandler" class="com.bank.webservice.LogHandler">
<order phase="loggingPhase"/>
</handler>
</OutFaultFlow>
<InFaultFlow>
<handler name="FaultInFlowLogHandler" class="com.bank.webservice.LogHandler">
<order phase="loggingPhase"/>
</handler>
</InFaultFlow>
</module>



[b]2.实现你的自己的Module extends from org.apache.axis2.modules.Module[/b]

import org.apache.axis2.AxisFault;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.description.AxisDescription;
import org.apache.axis2.description.AxisModule;
import org.apache.axis2.modules.Module;
import org.apache.neethi.Assertion;
import org.apache.neethi.Policy;

public class LoggingModule implements Module
{
// initialize the module
public void init(ConfigurationContext configContext, AxisModule module)
throws AxisFault
{
System.out.println("init");
}
public void engageNotify(AxisDescription axisDescription) throws AxisFault
{
}
// shutdown the module
public void shutdown(ConfigurationContext configurationContext)
throws AxisFault
{
System.out.println("shutdown");
}
public String[] getPolicyNamespaces()
{
return null;
}
public void applyPolicy(Policy policy, AxisDescription axisDescription)
throws AxisFault
{
}
public boolean canSupportAssertion(Assertion assertion)
{
return true;
}
}



[b]3.实现你的handler记录SOAP request and response Message.[/b]

import org.apache.axis2.AxisFault;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.engine.Handler;
import org.apache.axis2.handlers.AbstractHandler;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class LogHandler extends AbstractHandler implements Handler
{
private static final Log log = LogFactory.getLog(LogHandler.class);
private String name;
public String getName()
{
return name;
}
public InvocationResponse invoke(MessageContext msgContext)
throws AxisFault
{
// 向Tomcat控制台输出请求和响应SOAP消息
System.out.println("Soap Request" + msgContext.getEnvelope().toString());
log.info(msgContext.getEnvelope().toString());
return InvocationResponse.CONTINUE;
}
public void revoke(MessageContext msgContext)
{
System.out.println("Soap Response" + msgContext.getEnvelope().toString());
log.info(msgContext.getEnvelope().toString());
}
public void setName(String name)
{
this.name = name;
}
}
[b]把以上module相关的东西用 "jar cvf logging.mar ." 打成一个mar的包。
注意一定要把module.xml放在跟source同目录的META-INF 文件中。然后把mar文件放在
tomcat下的webapp/axis2/WEB-INF/modules下。[/b]
[img]
d:/source.JPG
[/img]

[b]Service Class的实现类[/b]

import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.xmlbeans.xml.stream.XMLStreamException;

public class SampleService {

public OMElement sayHello(OMElement element) {
element.build();
element.detach();

String rootName = element.getLocalName();
System.out.println("Reading " + rootName + " element");

OMElement childElement = element.getFirstElement();
String personToGreet = childElement.getText();

OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace omNs = fac.createOMNamespace(
"http://example1.org/example1", "example1");
OMElement method = fac.createOMElement("sayHelloResponse", omNs);
OMElement value = fac.createOMElement("greeting", omNs);
value.addChild(fac.createOMText(value, "Hello," + personToGreet));
method.addChild(value);

return method;
}

}


[b]部署此service需要的services.xml[/b]
<service name="SampleService">
<description>
This is a sample service created in the Axis2 User's Guide
</description>
[color=red]<module ref="logging"/>[/color]
<parameter name="ServiceClass">com.bank.webservice.SampleService</parameter>
<operation name="sayHello">
<messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>
<actionMapping>urn:sayHello</actionMapping>
</operation>
<operation name="ping">
<messageReceiver class="org.apache.axis2.receivers.RawXMLINOnlyMessageReceiver"/>
<actionMapping>urn:ping</actionMapping>
</operation>
</service>

[b]注意<module ref="logging"/>配置来在此service中使用logging 这个module
用jar cvf 命令把此service打成一个aar包部署在tomcat 下的webapp/axis2/WEB-INF/services 文件下。

此外还要修改axis2.xml 加入我们的handler起作用的phase "loggingPhase"(红色配置).[/b]
<phaseOrder type="InFlow">
<!-- System predefined phases -->
<phase name="Transport">
<handler name="RequestURIBasedDispatcher"
class="org.apache.axis2.dispatchers.RequestURIBasedDispatcher">
<order phase="Transport"/>
</handler>
<handler name="SOAPActionBasedDispatcher"
class="org.apache.axis2.dispatchers.SOAPActionBasedDispatcher">
<order phase="Transport"/>
</handler>
</phase>
<phase name="Addressing">
<handler name="AddressingBasedDispatcher"
class="org.apache.axis2.dispatchers.AddressingBasedDispatcher">
<order phase="Addressing"/>
</handler>
</phase>
<phase name="Security"/>
<phase name="PreDispatch"/>
<phase name="Dispatch" class="org.apache.axis2.engine.DispatchPhase">
<handler name="RequestURIBasedDispatcher"
class="org.apache.axis2.dispatchers.RequestURIBasedDispatcher"/>
<handler name="SOAPActionBasedDispatcher"
class="org.apache.axis2.dispatchers.SOAPActionBasedDispatcher"/>
<handler name="RequestURIOperationDispatcher"
class="org.apache.axis2.dispatchers.RequestURIOperationDispatcher"/>
<handler name="SOAPMessageBodyBasedDispatcher"
class="org.apache.axis2.dispatchers.SOAPMessageBodyBasedDispatcher"/>
<handler name="HTTPLocationBasedDispatcher"
class="org.apache.axis2.dispatchers.HTTPLocationBasedDispatcher"/>
<handler name="GenericProviderDispatcher"
class="org.apache.axis2.jaxws.dispatchers.GenericProviderDispatcher"/>
<handler name="MustUnderstandValidationDispatcher"
class="org.apache.axis2.jaxws.dispatchers.MustUnderstandValidationDispatcher"/>
</phase>
<phase name="RMPhase"/>
<!-- System predefined phases -->
<!-- After Postdispatch phase module author or service author can add any phase he want -->
<phase name="userDefinedMessageInPhase"/>
[color=red]<phase name="loggingPhase"/>[/color]
<phase name="OperationInPhase">
<handler name="MustUnderstandChecker"
class="org.apache.axis2.jaxws.dispatchers.MustUnderstandChecker">
<order phase="OperationInPhase"/>
</handler>
</phase>
<phase name="soapmonitorPhase"/>
</phaseOrder>
<phaseOrder type="OutFlow">
<!-- user can add his own phases to this area -->
<phase name="userDefinedMessageOutPhase"/>
[color=darkred] <phase name="loggingPhase"/>[/color]
<phase name="soapmonitorPhase"/>
<phase name="OperationOutPhase"/>
<!--system predefined phase-->
<!--these phase will run irrespective of the service-->
<phase name="RMPhase"/>
<phase name="PolicyDetermination"/>
<phase name="MessageOut"/>
<phase name="Security"/>
</phaseOrder>
<phaseOrder type="InFaultFlow">
<phase name="Addressing">
<handler name="AddressingBasedDispatcher"
class="org.apache.axis2.dispatchers.AddressingBasedDispatcher">
<order phase="Addressing"/>
</handler>
</phase>
<phase name="Security"/>
<phase name="PreDispatch"/>
<phase name="Dispatch" class="org.apache.axis2.engine.DispatchPhase">
<handler name="RequestURIBasedDispatcher"
class="org.apache.axis2.dispatchers.RequestURIBasedDispatcher"/>
<handler name="SOAPActionBasedDispatcher"
class="org.apache.axis2.dispatchers.SOAPActionBasedDispatcher"/>
<handler name="RequestURIOperationDispatcher"
class="org.apache.axis2.dispatchers.RequestURIOperationDispatcher"/>
<handler name="SOAPMessageBodyBasedDispatcher"
class="org.apache.axis2.dispatchers.SOAPMessageBodyBasedDispatcher"/>
<handler name="HTTPLocationBasedDispatcher"
class="org.apache.axis2.dispatchers.HTTPLocationBasedDispatcher"/>
<handler name="GenericProviderDispatcher"
class="org.apache.axis2.jaxws.dispatchers.GenericProviderDispatcher"/>
<handler name="MustUnderstandValidationDispatcher"
class="org.apache.axis2.jaxws.dispatchers.MustUnderstandValidationDispatcher"/>
</phase>
<phase name="RMPhase"/>
<!-- user can add his own phases to this area -->
[color=red]<phase name="loggingPhase"/>[/color]
<phase name="OperationInFaultPhase"/>
<phase name="soapmonitorPhase"/>
</phaseOrder>
<phaseOrder type="OutFaultFlow">
<!-- user can add his own phases to this area -->
[color=red] <phase name="loggingPhase"/>[/color]
<phase name="soapmonitorPhase"/>
<phase name="OperationOutFaultPhase"/>
<phase name="RMPhase"/>
<phase name="PolicyDetermination"/>
<phase name="MessageOut"/>
<phase name="Security"/>
</phaseOrder>

[b]好大功告成。写一个call service的client 类[/b]

import javax.xml.stream.XMLStreamException;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.Constants;
import org.apache.axis2.client.ServiceClient;

public class SampleClient {

private static EndpointReference targetEPR =
new EndpointReference(
"http://localhost:8080/axis2/services/SampleService");

public static OMElement greetUserPayload(String personToGreet) {
OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace omNs = fac.createOMNamespace(
"http://example1.org/example1", "example1");
OMElement method = fac.createOMElement("sayHello", omNs);
OMElement value = fac.createOMElement("personToGreet",
omNs);
value.addChild(fac.createOMText(value, personToGreet));
method.addChild(value);
return method;
}

public static void main(String[] args) {
try {
OMElement payload =
SampleClient.greetUserPayload("John");
Options options = new Options();
options.setTo(targetEPR);

options.setTransportInProtocol(Constants.TRANSPORT_HTTP);

ServiceClient sender = new ServiceClient();
sender.setOptions(options);
OMElement result = sender.sendReceive(payload);

String response = result.getFirstElement().getText();
System.out.println(response);

} catch (Exception e) { //(XMLStreamException e) {
System.out.println(e.toString());
}
}

}



[b]如果call完后你的log文件中出现了一下log证明我们的handler已经起作用了,记录了soap response and request message。 如果你想在别的service中使用这个module中的handler 只要在那个services.xml中引用logging这个module就ok了。[/b]

Soap Request[color=darkred][/color]<?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><example1:sayHello xmlns:example1="http://example1.org/example1"><example1:personToGreet>John</example1:personToGreet></example1:sayHello></soapenv:Body></soapenv:Envelope>
[INFO] <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><example1:sayHello xmlns:example1="http://example1.org/example1"><example1:personToGreet>John</example1:personToGreet></example1:sayHello></soapenv:Body></soapenv:Envelope>
Reading sayHello element
Soap Response<?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><example1:sayHelloResponse xmlns:example1="http://example1.org/example1"><example1:greeting>Hello,John</example1:greeting></example1:sayHelloResponse></soapenv:Body></soapenv:Envelope>
[INFO] <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><example1:sayHelloResponse xmlns:example1="http://example1.org/example1"><example1:greeting>Hello,John</example1:greeting></example1:sayHelloResponse></soapenv:Body></soapenv:Envelope>

经验总结,在许多情况下我们打出来的aar,跟mar 放在axis2的web-inf目录下,在axis在启动时会报aar中的services.xml 找不到,同样在mar中报module.xml找不到,在这种情况下,你直接把aar,或者mar解压开来放一个普通的文件夹中,直接把这个文件夹放到axis2的相应目录下,就ok了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值