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