From 9a0108ac6a39a1c797b1218312467abdcc6fd76e Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Fri, 7 Aug 2009 10:00:27 +0000 Subject: [PATCH] added support for @WebServiceProvider annotation to Spring's JaxWsServiceExporters (SPR-5988) --- .../jaxws/AbstractJaxWsServiceExporter.java | 20 +++++++++-- .../SimpleHttpServerJaxWsServiceExporter.java | 34 ++++++++++++++++--- .../jaxws/SimpleJaxWsServiceExporter.java | 22 ++++++++++-- 3 files changed, 66 insertions(+), 10 deletions(-) diff --git a/org.springframework.web/src/main/java/org/springframework/remoting/jaxws/AbstractJaxWsServiceExporter.java b/org.springframework.web/src/main/java/org/springframework/remoting/jaxws/AbstractJaxWsServiceExporter.java index cc62c79e3ef..f300bbe74fc 100644 --- a/org.springframework.web/src/main/java/org/springframework/remoting/jaxws/AbstractJaxWsServiceExporter.java +++ b/org.springframework.web/src/main/java/org/springframework/remoting/jaxws/AbstractJaxWsServiceExporter.java @@ -22,6 +22,7 @@ import java.util.Set; import java.util.concurrent.Executor; import javax.jws.WebService; import javax.xml.ws.Endpoint; +import javax.xml.ws.WebServiceProvider; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; @@ -101,8 +102,9 @@ public abstract class AbstractJaxWsServiceExporter implements BeanFactoryAware, String[] beanNames = this.beanFactory.getBeanNamesForType(Object.class, false, false); for (String beanName : beanNames) { Class type = this.beanFactory.getType(beanName); - WebService annotation = type.getAnnotation(WebService.class); - if (annotation != null) { + WebService wsAnnotation = type.getAnnotation(WebService.class); + WebServiceProvider wsProviderAnnotation = type.getAnnotation(WebServiceProvider.class); + if (wsAnnotation != null || wsProviderAnnotation != null) { Endpoint endpoint = Endpoint.create(this.beanFactory.getBean(beanName)); if (this.endpointProperties != null) { endpoint.setProperties(this.endpointProperties); @@ -110,7 +112,12 @@ public abstract class AbstractJaxWsServiceExporter implements BeanFactoryAware, if (this.executor != null) { endpoint.setExecutor(this.executor); } - publishEndpoint(endpoint, annotation); + if (wsAnnotation != null) { + publishEndpoint(endpoint, wsAnnotation); + } + else { + publishEndpoint(endpoint, wsProviderAnnotation); + } this.publishedEndpoints.add(endpoint); } } @@ -123,6 +130,13 @@ public abstract class AbstractJaxWsServiceExporter implements BeanFactoryAware, */ protected abstract void publishEndpoint(Endpoint endpoint, WebService annotation); + /** + * Actually publish the given provider endpoint. To be implemented by subclasses. + * @param endpoint the JAX-WS Provider Endpoint object + * @param annotation the service bean's WebServiceProvider annotation + */ + protected abstract void publishEndpoint(Endpoint endpoint, WebServiceProvider annotation); + /** * Stops all published endpoints, taking the web services offline. diff --git a/org.springframework.web/src/main/java/org/springframework/remoting/jaxws/SimpleHttpServerJaxWsServiceExporter.java b/org.springframework.web/src/main/java/org/springframework/remoting/jaxws/SimpleHttpServerJaxWsServiceExporter.java index b7afd9523c2..5b30a338dcd 100644 --- a/org.springframework.web/src/main/java/org/springframework/remoting/jaxws/SimpleHttpServerJaxWsServiceExporter.java +++ b/org.springframework.web/src/main/java/org/springframework/remoting/jaxws/SimpleHttpServerJaxWsServiceExporter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,9 +18,9 @@ package org.springframework.remoting.jaxws; import java.net.InetSocketAddress; import java.util.List; - import javax.jws.WebService; import javax.xml.ws.Endpoint; +import javax.xml.ws.WebServiceProvider; import com.sun.net.httpserver.Authenticator; import com.sun.net.httpserver.Filter; @@ -166,7 +166,22 @@ public class SimpleHttpServerJaxWsServiceExporter extends AbstractJaxWsServiceEx @Override protected void publishEndpoint(Endpoint endpoint, WebService annotation) { - String fullPath = this.basePath + annotation.serviceName(); + endpoint.publish(buildHttpContext(endpoint, annotation.serviceName())); + } + + @Override + protected void publishEndpoint(Endpoint endpoint, WebServiceProvider annotation) { + endpoint.publish(buildHttpContext(endpoint, annotation.serviceName())); + } + + /** + * Build the HttpContext for the given endpoint. + * @param endpoint the JAX-WS Provider Endpoint object + * @param serviceName the given service name + * @return the fully populated HttpContext + */ + protected HttpContext buildHttpContext(Endpoint endpoint, String serviceName) { + String fullPath = calculateEndpointPath(endpoint, serviceName); HttpContext httpContext = this.server.createContext(fullPath); if (this.filters != null) { httpContext.getFilters().addAll(this.filters); @@ -174,9 +189,20 @@ public class SimpleHttpServerJaxWsServiceExporter extends AbstractJaxWsServiceEx if (this.authenticator != null) { httpContext.setAuthenticator(this.authenticator); } - endpoint.publish(httpContext); + return httpContext; } + /** + * Calculate the full endpoint path for the given endpoint. + * @param endpoint the JAX-WS Provider Endpoint object + * @param serviceName the given service name + * @return the full endpoint path + */ + protected String calculateEndpointPath(Endpoint endpoint, String serviceName) { + return this.basePath + serviceName; + } + + @Override public void destroy() { super.destroy(); diff --git a/org.springframework.web/src/main/java/org/springframework/remoting/jaxws/SimpleJaxWsServiceExporter.java b/org.springframework.web/src/main/java/org/springframework/remoting/jaxws/SimpleJaxWsServiceExporter.java index aa4cd267e14..08c47e614c8 100644 --- a/org.springframework.web/src/main/java/org/springframework/remoting/jaxws/SimpleJaxWsServiceExporter.java +++ b/org.springframework.web/src/main/java/org/springframework/remoting/jaxws/SimpleJaxWsServiceExporter.java @@ -18,6 +18,7 @@ package org.springframework.remoting.jaxws; import javax.jws.WebService; import javax.xml.ws.Endpoint; +import javax.xml.ws.WebServiceProvider; /** * Simple exporter for JAX-WS services, autodetecting annotated service beans @@ -64,12 +65,27 @@ public class SimpleJaxWsServiceExporter extends AbstractJaxWsServiceExporter { @Override protected void publishEndpoint(Endpoint endpoint, WebService annotation) { - String fullAddress = this.baseAddress + annotation.serviceName(); + endpoint.publish(calculateEndpointAddress(endpoint, annotation.serviceName())); + } + + @Override + protected void publishEndpoint(Endpoint endpoint, WebServiceProvider annotation) { + endpoint.publish(calculateEndpointAddress(endpoint, annotation.serviceName())); + } + + /** + * Calculate the full endpoint address for the given endpoint. + * @param endpoint the JAX-WS Provider Endpoint object + * @param serviceName the given service name + * @return the full endpoint address + */ + protected String calculateEndpointAddress(Endpoint endpoint, String serviceName) { + String fullAddress = this.baseAddress + serviceName; if (endpoint.getClass().getName().startsWith("weblogic.")) { - // Workaround for WebLogic 10.3 + // Workaround for WebLogic 10.3 fullAddress = fullAddress + "/"; } - endpoint.publish(fullAddress); + return fullAddress; } }