我正在建立与公司内另一个应用程序的Soap服务的连接。有多个肥皂服务,每个都有自己的wsdl / xsd服务,但也共享许多通用模式的对象。
在创建第一个连接时,我设置了一个Client类:
public Service1Client extends WebServiceGatewaySupport{
(unrelated internal code)
}
使用以下设置在Configuration类中将其实例化为bean:
@Configuration
public class Service1Configuration{
private static final String COMMON_PACKAGE = "uninportant";
private static final String HEADER_PACKAGE = "uninportant";
private static final String SERVICE_PACKAGE = "uninportant";
@Bean
Jaxb2Marshaller marshaller(){
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setContextPaths(COMMON_PACKAGE, HEADER_PACKAGE, SERVICE_PACKAGE);
return marshaller;
}
@Bean
public ServiceV1Client(Jaxb2Marshaller marshaller, WebServiceMessageSender messageSender){
(unrelated code setting marshaller, messageSender and some properties)
}
@Bean
public WebServiceMessageSender messageSender() throws etc... {
(unrelated code)
return new HttpComponentsMessageSender(blabla);
}
}
所以我启动并运行了它。 下一步,添加第二个服务。在这一点上,我正在考虑,有很多通用代码,可以创建一个抽象客户端和抽象配置,并将尽可能多的通用代码移至抽象类,并将其扩展到每个服务特定的客户端和配置中
这是我第一次深入研究bean和抽象类之一,我很难把自己的头围绕着最终的结果。
问题1: Abstract配置类和所有已实现的配置类都应该都获得@Configuration标记吗?还是只有实现的类?
问题2:
我陷入困境的是Marshaller,更具体地说是:marshaller.setContextPaths(input)
与仅包含其自己的服务相比,创建包含所有服务的contextPaths的编组器的利弊是什么?
问题3: 然后在执行方面。如果我在带有@Bean批注的抽象Configuration类中创建编组器,则AbstractConfiguration的所有实现都包含与编组器完全相同的实例。
换句话说,我像这样设置抽象类:
@Configuration
public abstract class AbstractConfiguration{
private static final String COMMON_PACKAGE = "uninportant";
private static final String HEADER_PACKAGE = "uninportant";
@Bean
Jaxb2Marshaller marshaller(){
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setContextPaths(COMMON_PACKAGE, HEADER_PACKAGE, getServiceContextPath());
return marshaller;
}
protected abstract String getServiceContextPath();
}
每个客户端/配置实现都将实例化第一个实现的上下文路径。
如果最好的方法是以每个编组器仅包含其自身服务的上下文的方式来实现它:在仍将Bean定义移至抽象类的同时,完成该任务的最佳方法是什么?