added support for @WebServiceProvider annotation to Spring's JaxWsServiceExporters (SPR-5988)

This commit is contained in:
Juergen Hoeller 2009-08-07 10:00:27 +00:00
parent 2cd71758ed
commit 9a0108ac6a
3 changed files with 66 additions and 10 deletions

View File

@ -22,6 +22,7 @@ import java.util.Set;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import javax.jws.WebService; import javax.jws.WebService;
import javax.xml.ws.Endpoint; import javax.xml.ws.Endpoint;
import javax.xml.ws.WebServiceProvider;
import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware; 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); String[] beanNames = this.beanFactory.getBeanNamesForType(Object.class, false, false);
for (String beanName : beanNames) { for (String beanName : beanNames) {
Class<?> type = this.beanFactory.getType(beanName); Class<?> type = this.beanFactory.getType(beanName);
WebService annotation = type.getAnnotation(WebService.class); WebService wsAnnotation = type.getAnnotation(WebService.class);
if (annotation != null) { WebServiceProvider wsProviderAnnotation = type.getAnnotation(WebServiceProvider.class);
if (wsAnnotation != null || wsProviderAnnotation != null) {
Endpoint endpoint = Endpoint.create(this.beanFactory.getBean(beanName)); Endpoint endpoint = Endpoint.create(this.beanFactory.getBean(beanName));
if (this.endpointProperties != null) { if (this.endpointProperties != null) {
endpoint.setProperties(this.endpointProperties); endpoint.setProperties(this.endpointProperties);
@ -110,7 +112,12 @@ public abstract class AbstractJaxWsServiceExporter implements BeanFactoryAware,
if (this.executor != null) { if (this.executor != null) {
endpoint.setExecutor(this.executor); endpoint.setExecutor(this.executor);
} }
publishEndpoint(endpoint, annotation); if (wsAnnotation != null) {
publishEndpoint(endpoint, wsAnnotation);
}
else {
publishEndpoint(endpoint, wsProviderAnnotation);
}
this.publishedEndpoints.add(endpoint); this.publishedEndpoints.add(endpoint);
} }
} }
@ -123,6 +130,13 @@ public abstract class AbstractJaxWsServiceExporter implements BeanFactoryAware,
*/ */
protected abstract void publishEndpoint(Endpoint endpoint, WebService annotation); 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. * Stops all published endpoints, taking the web services offline.

View File

@ -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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with 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.net.InetSocketAddress;
import java.util.List; import java.util.List;
import javax.jws.WebService; import javax.jws.WebService;
import javax.xml.ws.Endpoint; import javax.xml.ws.Endpoint;
import javax.xml.ws.WebServiceProvider;
import com.sun.net.httpserver.Authenticator; import com.sun.net.httpserver.Authenticator;
import com.sun.net.httpserver.Filter; import com.sun.net.httpserver.Filter;
@ -166,7 +166,22 @@ public class SimpleHttpServerJaxWsServiceExporter extends AbstractJaxWsServiceEx
@Override @Override
protected void publishEndpoint(Endpoint endpoint, WebService annotation) { 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); HttpContext httpContext = this.server.createContext(fullPath);
if (this.filters != null) { if (this.filters != null) {
httpContext.getFilters().addAll(this.filters); httpContext.getFilters().addAll(this.filters);
@ -174,9 +189,20 @@ public class SimpleHttpServerJaxWsServiceExporter extends AbstractJaxWsServiceEx
if (this.authenticator != null) { if (this.authenticator != null) {
httpContext.setAuthenticator(this.authenticator); 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 @Override
public void destroy() { public void destroy() {
super.destroy(); super.destroy();

View File

@ -18,6 +18,7 @@ package org.springframework.remoting.jaxws;
import javax.jws.WebService; import javax.jws.WebService;
import javax.xml.ws.Endpoint; import javax.xml.ws.Endpoint;
import javax.xml.ws.WebServiceProvider;
/** /**
* Simple exporter for JAX-WS services, autodetecting annotated service beans * Simple exporter for JAX-WS services, autodetecting annotated service beans
@ -64,12 +65,27 @@ public class SimpleJaxWsServiceExporter extends AbstractJaxWsServiceExporter {
@Override @Override
protected void publishEndpoint(Endpoint endpoint, WebService annotation) { 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.")) { if (endpoint.getClass().getName().startsWith("weblogic.")) {
// Workaround for WebLogic 10.3 // Workaround for WebLogic 10.3
fullAddress = fullAddress + "/"; fullAddress = fullAddress + "/";
} }
endpoint.publish(fullAddress); return fullAddress;
} }
} }