Вы рассматривали возможность использования чего-то вроде прокси-функции Spring? Вы рассказываете ему немного о веб-сервисе в весеннем конфигурационном файле, и весь код вашего клиента имеет дело с интерфейсом, который вы создаете - ему даже не нужно знать, что на другой стороне есть веб-сервис! 1001 *
Пример конфигурации Spring:
<bean id="myService" class="org.springframework.remoting.jaxrpc.JaxRpcPortProxyFactoryBean">
<property name="serviceFactoryClass" value="org.apache.axis.client.ServiceFactory"/>
<property name="wsdlDocumentUrl" value="classpath://META-INF/myService.wsdl"/>
<property name="namespaceUri" value="http://com/myService"/>
<property name="endpointAddress" value="http://server/MyService"/>
<property name="serviceName" value="MyService"/>
<property name="portName" value="MyService"/>
<property name="serviceInterface" value="com.IMyService"/>
<property name="lookupServiceOnStartup" value="false"/>
</bean>
<bean id="myClient" class="com.MyServiceClient">
<property name="myService" ref="myService"/>
</bean>
Java:
public interface IMyService {
Foo getFoo();
}
public class MyServiceClient {
private IMyService myService;
public void setMyService(IMyService myService) {
this.myService = myService;
}
public void DoStuff() {
Foo foo = myService.getFoo();
...
}
}
Для пользовательских объектов может потребоваться создать подкласс JaxRpcPortProxyFactoryBean:
public class MyServiceFactoryBean extends JaxRpcPortProxyFactoryBean {
protected void postProcessJaxRpcService(Service service) {
TypeMappingRegistry registry = service.getTypeMappingRegistry();
TypeMapping mapping = registry.createTypeMapping();
QName qName = new QName("http://com/myService", "Foo");
mapping.register(Foo.class, qName,
new BeanSerializerFactory(Foo.class, qName),
new BeanDeserializerFactory(Foo.class, qName));
}
}
Что мне нравится в этом, так это код, который не должен заботиться о реализации службы не . Тестирование становится легким, и сплоченность ваших классов намного лучше.