Я создаю экземпляр JaxWsPortProxyFactoryBean и хочу установить на нем HandlerResolver для регистрации запросов.
@Bean(name="serviceName")
public JaxWsPortProxyFactoryBean serviceNameFactory() throws MalformedURLException {
JaxWsPortProxyFactoryBean factory = new JaxWsPortProxyFactoryBean();
factory.setHandlerResolver(new CustomHandlerResolver());
}
У меня также есть общая библиотека, которую я использую, в которой есть класс, который реализует BeanPostProcessor и добавляет свой собственный HandlerResolver:
public class CustomBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if(JaxWsPortProxyFactoryBean.class.isAssignableFrom(bean.getClass())) {
((JaxWsPortProxyFactoryBean)bean).setHandlerResolver(new AnotherCustomHandlerResolver());
}
return bean;
}
}
Проблема в том, что postProcessAfterInitialization
пошаговая установка AnotherCustomHandlerResolver уничтожает мой CustomHandlerResolver.
Я придумал обходной путь, расширив JaxWsPortProxyFactoryBean
и используя другой настраиваемый HandlerResolver, который поддерживает несколько экземпляров:
JaxWsPortProxyFactoryBean extension :
class MultipleHandlerJaxWsPortProxyFactoryBean extends JaxWsPortProxyFactoryBean {
MultipleHandleResolver resolver;
public MultipleHandlerJaxWsPortProxyFactoryBean() {
this.resolver = new MultipleHandleResolver();
// This instance ALWAYS gets the MultipleHandlerResolver as it's resolver
super.setHandlerResolver(resolver);
}
@Override
public void setHandlerResolver(HandlerResolver handlerResolver) {
// When setHandlerResolver is called we keep track of that, but don't set it on super
this.resolver.addResolver(handlerResolver);
}
}
Multiple Handler Resolver:
class MultipleHandleResolver implements HandlerResolver {
List<HandlerResolver> handlerResolvers;
public MultipleHandleResolver() {
this.handlerResolvers = new ArrayList<HandlerResolver>();
}
/**
* When we get the handler chain we now iterate over all of our HandlerResolvers to get their handler chains
*/
@Override
public List<Handler> getHandlerChain(PortInfo portInfo) {
List<Handler> handlerList = new ArrayList<Handler>();
for (HandlerResolver handlerResolver : this.handlerResolvers) {
handlerList.addAll(handlerResolver.getHandlerChain(portInfo));
}
return handlerList;
}
public void addResolver(HandlerResolver resolver) {
this.handlerResolvers.add(resolver);
}
}
Похоже, что очень сложно просто добавить обработчики в цепочку (и это также требует втягивания настраиваемого JaxWsPortProxyFactoryBean в мой bean-компонент конфигурация). Есть ли встроенная поддержка для этого с JaxWsPortProxyFactoryBean?