JaxWsPortProxyFactoryBean是否内置支持追加HandlerResolver?
首先直接给结论:JaxWsPortProxyFactoryBean 本身并没有提供内置的多 HandlerResolver 合并/追加支持。它的 setHandlerResolver 方法是直接替换当前的 HandlerResolver 实例,这就是为什么你的 CustomHandlerResolver 会被 BeanPostProcessor 中的 AnotherCustomHandlerResolver 覆盖的核心原因。
你的现有方案优化思路
你已经实现的扩展类方案是可行的,但确实需要修改所有 JaxWsPortProxyFactoryBean 的配置。这里提供一个更轻量的优化方向:修改 CustomBeanPostProcessor,让它主动合并现有的 HandlerResolver,而不是强制替换,这样就不需要替换所有的 JaxWsPortProxyFactoryBean 实例。
修改后的 BeanPostProcessor 代码如下:
public class CustomBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if(JaxWsPortProxyFactoryBean.class.isAssignableFrom(bean.getClass())) { JaxWsPortProxyFactoryBean factoryBean = (JaxWsPortProxyFactoryBean) bean; HandlerResolver existingResolver = factoryBean.getHandlerResolver(); MultipleHandleResolver combinedResolver; // 检查当前Resolver是否已经是组合类型,是的话直接复用 if (existingResolver instanceof MultipleHandleResolver) { combinedResolver = (MultipleHandleResolver) existingResolver; } else { // 否则创建新的组合Resolver,把已有的Resolver加入进去 combinedResolver = new MultipleHandleResolver(); if (existingResolver != null) { combinedResolver.addResolver(existingResolver); } // 设置组合Resolver到FactoryBean factoryBean.setHandlerResolver(combinedResolver); } // 追加自定义的AnotherCustomHandlerResolver combinedResolver.addResolver(new AnotherCustomHandlerResolver()); } return bean; } }
这样修改后,不管你在 @Bean 配置中设置了什么 HandlerResolver,BeanPostProcessor 都会自动把它和 AnotherCustomHandlerResolver 合并到同一个组合Resolver中,不需要修改任何 JaxWsPortProxyFactoryBean 的配置代码。
另一种思路:直接使用 Handler 列表而非 HandlerResolver
如果你的 Handler 不需要根据 PortInfo 动态调整(比如只是固定的日志Handler),可以考虑直接使用 JaxWsPortProxyFactoryBean 的 setHandlers(List<Handler> handlers) 方法来注册 Handler。这种情况下,你同样可以修改 BeanPostProcessor 来合并 Handler 列表而不是替换:
public class CustomBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if(JaxWsPortProxyFactoryBean.class.isAssignableFrom(bean.getClass())) { JaxWsPortProxyFactoryBean factoryBean = (JaxWsPortProxyFactoryBean) bean; List<Handler> existingHandlers = factoryBean.getHandlers(); List<Handler> newHandlers = new ArrayList<>(); // 保留已有的Handler if (existingHandlers != null) { newHandlers.addAll(existingHandlers); } // 追加自定义Handler newHandlers.add(new YourCustomHandler()); factoryBean.setHandlers(newHandlers); } return bean; } }
这种方式不需要处理 HandlerResolver 的层级,更适合静态 Handler 的场景。
总结
JaxWsPortProxyFactoryBean 没有内置的多 HandlerResolver 追加支持,所以你需要通过自定义组合Resolver的方式来实现。修改 BeanPostProcessor 是相对更轻量的方案,不需要改动现有 FactoryBean 的配置;而如果你需要在多个 FactoryBean 中统一使用多Resolver机制,扩展 JaxWsPortProxyFactoryBean 的方式也能很好地工作。
内容的提问来源于stack exchange,提问作者NominSim

