You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-user@axis.apache.org by Victor Rentea <vi...@gmail.com> on 2010/02/18 14:54:41 UTC

Axis2 1.5.1, JAX-WS and Rampart: client and endpoint configuration

Hy everyone!

I built a working (?) solution and I want your opinion if this is a
safe approach, and if its semantically consistent with Axis2
internals.
I would really appreciate if you could give me a hand because my
knowledge of Axis internals is very limited.
Many will be interested in this subject especially because the
examples on the net are missing, and I didn’t managed to find anything
useful on this topic.

My requirements are:
Build J2ee web apps that expose secure web services with the latest
stable technology.

The solution I am building consists of an axis engine with the JAX-WS
services deployed right onto the web-app classes folder (next to the
Axis2Servlet), not putting any jaxws jar in servicejar.

Following [1] I managed to create an endpoint that used Rampart with
JAX-WS. By using SoapUI I managed to test it successfully. In fact,
this behavior (rampart configured on a per-axis2 engine basis) is
exactly what I needed, because all my webservices deployed there where
homogenous (part of the same application).

The next task, as other had also encountered [2], is creating a client
jax-ws application to consume the secure WS. I really wanted to stay
on the JAX-WS world because of the great JAXB and the Proxy feature,
that kept my code clean and small. Of course, I guess one can always
switch to the old JAX-RPC approach, that works perfect with Axis2, but
this seemed to me as a “downgrade”.

So I tried building a JAX-WS client to consume a secured WS.

First observation: another axis2 runtime was build in order to invoke
a jax-ws call (some modules were loaded again, time was wasted).

Second obs: the new runtime was not using the axis2.xml configuration
file, so the Rampart module was not loaded. The sent messages were not
passing through Rampart. What I needed is to somehow reuse the
existing Axis2 engine (started with the web-app) with the JAX-WS call.

As this seemed pseudo-impossible, I tried to at least reuse the
org.apache.axis2.context.ConfigurationContext from the running engine.
In order to get a grip of that context, I created a module that stored
this context for later use in a static field CONFIG_CONTEXT_REF.

After deep searches, I found
org.apache.axis2.jaxws.ClientConfigurationFactory that had an factory
method

public static ClientConfigurationFactory newInstance() {
return (ClientConfigurationFactory)MetadataFactoryRegistry.getFactory(ClientConfigurationFactory.class);
   }
That can be customized (through
org.apache.axis2.metadata.registry.MetadataFactoryRegistry) to return
ANOTHER IMPLEMENTATION, by means of a particular configuration file
placed at
WEB-INF/classes/META-INF/services/org.apache.axis2.metadata.registry.MetadataFactoryRegistry


With the contents of

org.apache.axis2.jaxws.ClientConfigurationFactory|com.sample.CustomClientConfigurationFactory

So what I did is implement a

public class CustomClientConfigurationFactory extends
org.apache.axis2.jaxws.ClientConfigurationFactory {
	@Override
	public synchronized ConfigurationContext getClientConfigurationContext() {
		if (MyModule.CONFIG_CONTEXT_REF!=null) {
			return MyModule.CONFIG_CONTEXT_REF;
		} else {
			return super.getClientConfigurationContext();
		}
	}
}


That returned the stored config context from the module.

The strange thing is that when I deployed this solution, I noticed
that no additional Axis engine was created anymore, and the Rampart
module did his job, securing out and in flow.



[1] http://markmail.org/message/dkwjvskrh3gysvnw?q=list#query:list+page:1+mid:aioxif5ayfhwagnz+state:results
[2] http://markmail.org/message/dkwjvskrh3gysvnw?q=list#query:list+page:1+mid:t7cpqqdc7pbcstol+state:results