Buscar este blog

miércoles, 24 de junio de 2015

Integrate JAX-WS in Spring Context

Creating a JAX-WS client with javax.xml.ws.Service is very simple, but if you are working with spring, then you would like to integrate it in Spring Context. In this way, you can get your client by using @Autowired.

The solution is to create a Factory Class responsible for instanciate the client.

Other common requirement is to read the service endpoing from a config file, so it could vary from enviroment.

Factory code:
import javax.xml.namespace.QName;
import javax.xml.ws.BindingProvider;

import org.springframework.beans.factory.FactoryBean;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

import es.sisifo.test.ws.webservices.UsuarioWebService;
import es.sisifo.test.ws.webservicesimpl.UsuarioService;



public class UsuariosWebServiceFactoryBean implements FactoryBean<UsuarioWebService> {

 private final String namespaceUri;
 private final String serviceName;
 private final String wsdlLocation;
 private final String serviceEndPoint;


 public UsuariosWebServiceFactoryBean(final String namespaceUri, final String serviceName, final String wsdlLocation, final String serviceEndPoint) {
  this.namespaceUri = namespaceUri;
  this.serviceName = serviceName;
  this.wsdlLocation = wsdlLocation;
  this.serviceEndPoint = serviceEndPoint;
 }


 @Override
 public UsuarioWebService getObject() throws Exception {
  final QName serviceQName = new QName(namespaceUri, serviceName);
  final Resource serviceWSDLResource =  new ClassPathResource(wsdlLocation);

  final UsuarioService service = new UsuarioService(serviceWSDLResource.getURL(), serviceQName);
  final UsuarioWebService port = service.getUsuarioWebServiceImplPort();

  final BindingProvider bindingProvider = (BindingProvider)port;
  bindingProvider.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, serviceEndPoint);

  return port;
 }


 @Override
 public Class<?> getObjectType() {
     return UsuarioWebService.class;
 }


 @Override
 public boolean isSingleton() {
  return true;
 }
}

To use this class, you only need to declare this factory as a normal bean, for example, in the application-context.xml:
<bean id="usuarioService" class="es.sisifo.test.usuarios.webservice.UsuariosWebServiceFactoryBean">   
 <constructor-arg name="namespaceUri"      value="${webService.usuarios.namespaceUri}" />
 <constructor-arg name="serviceName"       value="${webService.usuarios.serviceName}" />
 <constructor-arg name="wsdlLocation"      value="${webService.usuarios.wsdlDocumentLocation}" />
 <constructor-arg name="serviceEndPoint"   value="${webService.usuario.serviceEndPoint}" />
</bean>

And this would be the properties file:
webService.usuarios.namespaceUri     = http://webservicesimpl.ws.testc.es/
webService.usuarios.serviceName      = usuarioService
webService.usuarios.wsdlLocation     = /wsdl/UsuarioService.wsdl
webService.usuarios.serviceEndPoint  = http://localhost:8080/test-ws/servizos/UsuarioService

Note that the WSDL file is in the application classpath, i.e, in main/resources folder, inside wsdl directory.
You can check how to create all necesary classes for the client in this post: http://trabajosdesisifo.blogspot.com.es/2015/04/eclipse-maven-configure-wsdl2java.html 

No hay comentarios:

Publicar un comentario