问题描述
最近在使用SpringBoot写个人博客来练手
在使用RestFul风格来发送Put请求时,报错Request method ‘POST’ not supported
org.springframework.web.HttpRequestMethodNotSupportedException:Requestmethod'POST'not supported在网上搜了普遍的解决方法,如下:
- 在配置文件中添加以下代码,开启HiddenHttpMethodFilter
spring.mvc.hiddenmethod.filter.enable=true- 在表单中添加以下代码,修改请求方式
<formaction="/admin/put"method="post"><inputname="_method"value="PUT"type="hidden"><inputtype="submit"value="PUT提交"/></form>但是以上的方法都没有解决我的问题,仍然报错“不支持POST请求”
后来我通过对源码进行断点分析,发现程序没有走SpringBoot自动配置类WebMvcAutoConfiguration中的OrderedHiddenHttpMethodFilter方法,而该方法正是让post请求包装成PUT、DELETE的核心方法。
前面已经通过配置spring.mvc.hiddenmethod.filter.enable=true开启了该方法,但是为什么没有起作用呢?
我注意到在自动配置类WebMvcAutoConfiguration上面有一句注解@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
我明白了,之前在做登录拦截的时候,编写了WebMvcConfiguration,该类继承了WebMvcConfigurationSupport,所以自己编写的WebMvcConfiguration类不能让SpringBoot的自动配置类起作用了。
解决办法
在自己编写的WebMvcConfiguration中配置OrderedHiddenHttpMethodFilter
@ConfigurationpublicclassWebMvcConfigurationextendsWebMvcConfigurationSupport{//配置OrderedHiddenHttpMethodFilter@BeanpublicOrderedHiddenHttpMethodFilterhiddenHttpMethodFilter(){returnnewOrderedHiddenHttpMethodFilter();}@OverrideprotectedvoidaddInterceptors(InterceptorRegistryregistry){registry.addInterceptor(newLoginInterceptor()).addPathPatterns("/admin/**").excludePathPatterns("/admin").excludePathPatterns("/admin/user").excludePathPatterns("/css/**").excludePathPatterns("/img/**").excludePathPatterns("/js/**").excludePathPatterns("/lib/**");}}问题解决!