Spring WS中自定义替换DefaultMethodEndpointAdapter的正确配置方法是什么?
Spring WS 替换默认DefaultMethodEndpointAdapter的最优配置方案
以下是三种稳定可靠的配置方案,可按需选择:
方案1:使用命名空间原生属性替换(最推荐)
如果你使用Spring WS提供的<sws:annotation-driven>命名空间配置,直接通过adapter-class属性指定自定义适配器即可,官方原生支持该替换逻辑,完全不会实例化默认的DefaultMethodEndpointAdapter:
<sws:annotation-driven adapter-class="somepackage.MyMethodEndpointAdapter"/>
该方案无需额外编码,兼容性最强,是优先选择的实现方式。
方案2:设置更高优先级适配
DefaultMethodEndpointAdapter实现了Ordered接口,默认优先级值为最低优先级。只需要给自定义适配器设置更高的优先级,就可以保证请求优先被自定义适配器处理,即使容器中存在默认实例也不会影响业务逻辑:
<bean id="defaultMethodEndpointAdapter" class="somepackage.MyMethodEndpointAdapter"> <property name="order" value="0"/> </bean>
优先级数值越小优先级越高,只要自定义适配器的优先级高于默认值,就会优先被调用。
方案3:彻底移除默认Bean定义
如果要求容器中完全不存在默认的DefaultMethodEndpointAdapter实例,可以通过BeanDefinitionRegistryPostProcessor在容器初始化阶段主动删除默认的Bean定义:
- 实现Bean定义移除处理器
import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor; import org.springframework.ws.server.endpoint.adapter.DefaultMethodEndpointAdapter; public class DefaultEndpointAdapterRemover implements BeanDefinitionRegistryPostProcessor { @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { String[] beanNames = registry.getBeanDefinitionNames(); for (String beanName : beanNames) { BeanDefinition definition = registry.getBeanDefinition(beanName); if (DefaultMethodEndpointAdapter.class.getName().equals(definition.getBeanClassName())) { registry.removeBeanDefinition(beanName); } } } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { } }
- 在XML配置中注册该处理器和自定义适配器
<bean class="somepackage.DefaultEndpointAdapterRemover"/> <bean id="defaultMethodEndpointAdapter" class="somepackage.MyMethodEndpointAdapter"/>
该方案会彻底清除所有默认的DefaultMethodEndpointAdapter实例,仅保留自定义实现。
内容的提问来源于stack exchange,提问作者Artur Linhart
相关产品推荐
相关产品推荐

