Spring 4.2遗留应用添加Rest API遇405 Method Not Allowed问题
从你提供的日志和代码来看,虽然Spring已经正确识别并映射了你的/api POST接口,但最后出现的Rejected bean name 'productCatalogResource': no URL paths identified日志,说明遗留的DispatcherServlet配置(比如旧的HandlerMapping)优先拦截了请求,覆盖了新的@RestController映射,导致POST请求被拒绝。下面是具体的排查和解决步骤:
1. 检查遗留的HandlerMapping配置
首先去看你的DispatcherServlet配置文件(通常是dispatcher-servlet.xml或者对应的Java配置类),有没有使用XML配置的SimpleUrlHandlerMapping或者其他传统HandlerMapping:
<!-- 这类旧配置会优先于注解驱动的映射 --> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/">welcomeController</prop> <!-- 可能存在和/api相关的旧映射 --> </props> </property> </bean>
这类基于XML的HandlerMapping默认优先级和注解驱动的RequestMappingHandlerMapping一致,甚至更高,会直接覆盖你的@RestController映射。
2. 提升注解驱动映射的优先级
要让@RestController的注解映射优先生效,你需要调整RequestMappingHandlerMapping的order属性(值越小,优先级越高):
如果你用XML配置:
<!-- 显式配置RequestMappingHandlerMapping并设置更高优先级 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"> <property name="order" value="-1"/> <!-- 比默认的0优先级更高 --> </bean> <!-- 同时确保开启注解驱动 --> <mvc:annotation-driven> <mvc:mapping path="/api/**"/> <!-- 限定只处理/api路径的请求 --> </mvc:annotation-driven>
如果你用Java配置:
@Configuration @EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter { @Bean public RequestMappingHandlerMapping requestMappingHandlerMapping() { RequestMappingHandlerMapping mapping = new RequestMappingHandlerMapping(); mapping.setOrder(-1); // 提升优先级 return mapping; } }
3. 验证请求的Content-Type是否符合要求
你的接口设置了consumes = { MediaType.APPLICATION_JSON_VALUE },如果请求没有携带Content-Type: application/json头,Spring会找不到匹配的处理方法,也可能返回405错误。所以要确认你的POST请求是否正确设置了这个请求头。
4. 确认控制器扫描范围
虽然日志已经显示Spring找到了ProductCatalogResource类,但还是要确保你的控制器所在包被正确扫描:
<!-- 在dispatcher-servlet.xml中添加组件扫描 --> <context:component-scan base-package="com.org.webservice.controller"/>
或者在Java配置类中添加@ComponentScan("com.org.webservice.controller")。
最后验证
调整配置后重启应用,再次发起POST请求到http://localhost:8090/api,同时查看日志,确认/api的POST映射被正确处理,不再出现拒绝的日志。
内容的提问来源于stack exchange,提问作者user2555212

