Hi
I need to do some programatic processing before a SOAP message is sent and thus I use javax.xml.rpc.handler.GenericHandler.
My code works fine if I do not use any Spring related Remoting support = using plain Axis generated code based on a .wsdl file.
However if I use org.springframework.remoting.jaxrpc.JaxRpcPortProx yFactoryBean
my handler is never invoked even though I register the handler excatly the same way as I will do it with pure Axis code.
I am pasting some snipets here:
Spring.xml
Code:<bean id="ediWS" class="dk.webfragt.access.edi.EDIWebServiceFactory"> <property name="serviceInterface"> <value>dk.webfragt.access.edi.Version</value> </property> <property name="wsdlDocumentUrl"> <value>http://localhost:8181/axis/services/Version?wsdl</value> </property> <property name="namespaceUri"> <value>http://localhost:8181/axis/services/Version</value> </property> <property name="serviceName"> <value>VersionService</value> </property> <property name="portName"> <value>Version</value> </property> </bean>
And my factory that registers my handler in the postProcessJaxRpcService.
Code:public class EDIWebServiceFactory extends JaxRpcPortProxyFactoryBean { protected void postProcessJaxRpcService(Service service) { logger.debug("XXX Setting Handler on Port - START"); List list = service.getHandlerRegistry().getHandlerChain(new QName("Version")); list.add(new HandlerInfo(EDIHeaderHandler.class, null, null)); logger.debug("XXX Setting Handler on Port - DONE"); } }
When I do this my handler is never invoked and thus the SOAP message can't be modified in my handler before sending it to the remote server. If I use pure Axis my handler is invoked.
If I use this pure Axis code it works
Where the code ECBroker2Locator is auto generated by Axis.[/code]Code:logger.debug("Getting EDI JAX-RPC service at " + url); ECBroker2Locator loc = new ECBroker2Locator(); broker = loc.geteCBrokerIFPort(new URL(url)); logger.debug("Got EDI JAX-RPC service"); logger.debug("Setting Handler on Port - START"); Service jax = (Service) loc; List list = jax.getHandlerRegistry().getHandlerChain(new QName("eCBrokerIFPort")); list.add(new HandlerInfo(EDIHeaderHandler.class, null, null)); logger.debug("Setting Handler on Port - DONE"); }
And from my tomcat log
The JAX-RPC service is created fine and the handler is registered (I hope so because I do not get any exceptions)Code:main 10 jan 2005 14:36:02 DEBUG dk.webfragt.access.edi.EDIWebServiceFactory - Creating JAX-RPC service [VersionService] main 10 jan 2005 14:36:03 INFO dk.webfragt.access.edi.EDIWebServiceFactory - JAX-RPC service [VersionService] created main 10 jan 2005 14:36:03 DEBUG dk.webfragt.access.edi.EDIWebServiceFactory - XXX Setting Handler on Port - START +++ main 10 jan 2005 14:36:04 DEBUG dk.webfragt.access.edi.EDIWebServiceFactory - XXX Setting Handler on Port - DONE main 10 jan 2005 14:36:04 INFO dk.webfragt.access.edi.EDIWebServiceFactory - Using service interface [dk.webfragt.access.edi.Version] for JAX-RPC object [{http://localhost:8181/axis/services/Version}Version] - directly implemented main 10 jan 2005 14:36:04 DEBUG dk.webfragt.access.edi.EDIDao - Setting service
And when I run the webservice I get the response from the remote server
But my handler is never invoked - I have a System.out call and a logger output too but nothing in the tomcat log. I also checked with DEBUG level for apache.axis but the SOAP message did not contain my modifications.Code:http8080-Processor4 10 jan 2005 14:36:18 DEBUG dk.webfragt.access.edi.EDIDao - Getting version +++ return from WS: Apache Axis version: 1.1 Built on Jun 13, 2003 (09:19:43 EDT)


Reply With Quote