3

I'm creating a JaxWsPortProxyFactoryBean instance and want to set a HandlerResolver on it to log requests.

@Bean(name="serviceName")
public JaxWsPortProxyFactoryBean serviceNameFactory() throws MalformedURLException {
    JaxWsPortProxyFactoryBean factory = new JaxWsPortProxyFactoryBean();
    factory.setHandlerResolver(new CustomHandlerResolver());
}

I also have a common library I'm pulling in that has a class which implements BeanPostProcessor and adds it's own custom 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;
    }
}

The problem is that the postProcessAfterInitialization step setting the AnotherCustomHandlerResolver blows away my CustomHandlerResolver.

I've come up with a workaround by extending the JaxWsPortProxyFactoryBean and using a different custom HandlerResolver that holds onto multiple instances:

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);
    }

}

This seems like a lot of trouble just to append handlers to the chain (and it also requires pulling in the custom JaxWsPortProxyFactoryBean into my bean configuration). Is there built in support to do this with the JaxWsPortProxyFactoryBean?

NominSim
  • 8,447
  • 3
  • 28
  • 38

0 Answers0