记一次SpringMVC访问静态资源405错误修复

前言

访问静态资源出现405错误

1
警告 [http-nio-8080-exec-8] org.springframework.web.servlet.PageNotFound.handleHttpRequestMethodNotSupported Request method 'GET' not supported
1
2
3
4
HTTP Status 405 - Request method 'GET' not supported
type Status report
message Request method 'GET' not supported
description The specified HTTP method is not allowed for the requested resource.

stackoverflow解释

开启DefaultServletHandlerConfigurer
或者配置ResourceHandler
二选一

1
2
3
4
5
6
7
8
9
10
11
12
public class WebConfig extends WebMvcConfigurerAdapter {

@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}

// @Override
// public void addResourceHandlers(ResourceHandlerRegistry registry) {
// registry.addResourceHandler("/static/**").addResourceLocations("/static/**");
// }
}

使用

1
@RequestMapping(value = "/path", method = RequestMethod.GET)

替换

1
@RequestMapping(value = "/path", method = RequestMethod.POST)

问题是
第一步我明显配置好的了。
第二步我还不至于犯这么低级的错误(事实上就是这么低级的错误)

修bug之路

  1. 以为是IDEA的bug, 像Android Studio一样, 需要隔三差五的ReBuild一下。(405)
  2. 删除项目目录下的outtarget文件夹, 重新编译运行。(405)
  3. 新建项目, 将InitializerWebConfig复制到新项目, 编译运行。(成功)
  4. 将全部代码复制一遍到新目录。(405)
  5. 将所有@Compontent注释, 保留一个简单的HelloWorld的@Controller。(成功)
  6. 一个个@Compontent恢复,终于找到bug所在。

问题所在

我在之前添加了个PostMapping, 加上了TODO后, 就忘记这件事了。
之后就开始出现访问静态资源405错误。页面能正常打开,就是样式丢失。

1
2
3
4
5
6
7
8
9
@Controller
public class UserController{
// 省略其他代码
@PostMapping()
public String addUser(){
//TODO 增加用户
return "";
}
}

原因就在这, name的默认值是"",会拦截所有不经过其他RequestMappingurl
静态资源也因此被拦截, 需要通过Post方式获取。

1
2
3
4
5
6
7
8
9
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequestMapping(method = RequestMethod.POST)
public @interface PostMapping {
@AliasFor(annotation = RequestMapping.class)
String name() default "";
// 省略其他代码
}

解决方法

将这段代码注释掉, 或者将PostMappingname设置下。

1
2
3
4
5
6
7
8
9
@Controller
public class UserController{
// 省略其他代码
// @PostMapping("/admin/user")
// public String addUser(){
// //TODO 增加用户
// return "";
// }
}