You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JaxWsPortProxyFactoryBean是否内置支持追加HandlerResolver?

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 07:22:49