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

SpringBoot注册多个MessageDispatcherServlet遇404问题求助

解决方案

1. 修正MessageDispatcherServlet的Bean定义方法名

Java不允许同一个类中存在同名同参数列表的方法,你代码里两个创建MessageDispatcherServlet的方法名完全重复,即使指定了name属性也会导致Bean创建逻辑异常。修改方法名以区分两个Bean:

@Bean(name="a_servlet")
public MessageDispatcherServlet aMessageDispatcherServlet(WebApplicationContext context) {
    MessageDispatcherServlet servlet = new MessageDispatcherServlet(context);
    servlet.setTransformWsdlLocation(true);
    // 无需重复调用setApplicationContext,构造函数已传入上下文
    return servlet;
}

@Bean(name="b_servlet")
public MessageDispatcherServlet bMessageDispatcherServlet(WebApplicationContext context, @Qualifier("soap12MessageFactory") SaajSoapMessageFactory soap12MessageFactory) {
    MessageDispatcherServlet servlet = new MessageDispatcherServlet(context);
    servlet.setTransformWsdlLocation(true);
    servlet.setMessageFactory(soap12MessageFactory); // 绑定SOAP1.2消息工厂
    return servlet;
}

2. 配置SOAP1.2专属消息工厂

为/soap/b/*对应的Servlet创建SOAP1.2版本的消息工厂Bean,/soap/a/*默认使用SOAP1.1工厂无需额外配置:

@Bean
public SaajSoapMessageFactory soap12MessageFactory() {
    SaajSoapMessageFactory factory = new SaajSoapMessageFactory();
    factory.setSoapVersion(SoapVersion.SOAP_12);
    return factory;
}

3. 让Spring MVC避开SOAP请求路径

Spring Boot默认的Spring MVC DispatcherServlet映射路径为/*,会优先拦截所有请求,导致你的MessageDispatcherServlet无法处理/soap/b/*请求。在application.properties中添加配置排除该路径:

spring.mvc.servlet.exclude-path-patterns=/soap/**

4. 提升MessageDispatcherServlet的处理优先级

设置ServletRegistrationBean的order属性,确保你的SOAP Servlet比Spring MVC的DispatcherServlet拥有更高的处理优先级(数值越小优先级越高):

@Bean
public ServletRegistrationBean aDispatcherServlet(@Qualifier("a_servlet") MessageDispatcherServlet servlet) {
    ServletRegistrationBean<MessageDispatcherServlet> registration = new ServletRegistrationBean<>(servlet, "/soap/a/*");
    registration.setOrder(1); // 高于Spring MVC默认的order=2
    return registration;
}

@Bean
public ServletRegistrationBean bDispatcherServlet(@Qualifier("b_servlet") MessageDispatcherServlet servlet) {
    ServletRegistrationBean<MessageDispatcherServlet> registration = new ServletRegistrationBean<>(servlet, "/soap/b/*");
    registration.setOrder(1);
    return registration;
}

5. 验证配置

重启应用后访问actuator/mappings,应该能看到/soap/a/*和/soap/b/*的映射条目,此时发送SOAP1.2请求到/soap/b/*即可正常处理。

内容的提问来源于stack exchange,提问作者rhbc73

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 08:30:08