Help

Built with Seam

You can find the full source code for this website in the Seam package in the directory /examples/wiki. It is licensed under the LGPL.

Here is a simple way to access web service clients from Seam.

Objectives

  • Access web services clients as if they are seam components
  • Allow web service clients to be mocked out for testing
  • Provide dynamic substitution of endpoint address
  • Simple configuration

Example

Here is what the configuration looks like:

	<jaxws:client-factory name="sampleServiceClient" 
		serviceQName="{http://service.jaxws.taylor.net/}SampleService" 
		serviceEndpointInterface="net.taylor.sample.service.SampleService"
		endpointAddress="@sample.service.endpoint@"/>

Here is the injection of the client:

	@In
	private SampleService sampleServiceClient;

Here is the factory code. Note the use of @Unwrap.

@Scope(ScopeType.APPLICATION)
@Install(value = false, precedence = Install.FRAMEWORK)
@AutoCreate
@BypassInterceptors
public class ClientFactory {

	private Object client;

	private String serviceQName;

	private String wsdlLocation;

	private Class<?> serviceEndpointInterface;

	private String endpointAddress;

	// setters/getters
	
	@Create
	public void create() throws Exception {
		Service service = Service.create(new URL(getWsdlLocation()), QName
				.valueOf(getServiceQName()));
		client = service.getPort(getServiceEndpointInterface());

		Map<String, Object> requestContext = ((BindingProvider) client)
				.getRequestContext();
		requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
				getEndpointAddress());
	}

	@Unwrap
	public Object getClient() {
		return client;
	}
}

Here is the full code: ClientFactory.java