Есть ли встроенная поддержка добавления обработчиков к набору HandlerResolver в JaxWsPortProxyFactoryBean? - PullRequest
3 голосов
/ 19 июня 2020

Я создаю экземпляр 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?

...