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
相关产品推荐
相关产品推荐

