3

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 拡張:

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

複数ハンドラー リゾルバー:

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 でこれを行うためのサポートが組み込まれていますか?

4

0 に答える 0