关于SpringBoot的PUT提交不生效
最近修改控制器的api为REST风格,修改用户信息用put方法,在前端html页面form表单中添加hidden
<form th:action="@{/user}" method="post">
<input type="hidden" name="_method" value="put">
添加完成之后,点击提交,发现用户信息没修改,控制台显示调用了新增用户的方法,以下是新增和修改用户的代码
@PostMapping(value="user")
public String addUser(User user){
System.out.println("添加用户");
userService.addUser(user);
return "redirect:/users";
}
@PutMapping(value="user")
public String updateUser(User user){
System.out.println("修改用户");
userService.updateUser(user);
return "redirect:/users";
}
注释掉addUser方法之后,点击修改报错
There was an unexpected error (type=Method Not Allowed, status=405).
Request method 'POST' not supported
org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported
at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:201)
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:421)
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:367)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.getHandlerInternal(RequestMappingHandlerMapping.java:449)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.getHandlerInternal(RequestMappingHandlerMapping.java:67)
at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:393)
看报错信息,请求是以POST方式提交的,说明HiddenHttpMethodFilter没有生效,到WebMvcAutoConfiguration类中查看源码,找到HiddenHttpMethodFilter的配置:
@Bean
@ConditionalOnMissingBean(HiddenHttpMethodFilter.class)
@ConditionalOnProperty(prefix = "spring.mvc.hiddenmethod.filter", name = "enabled", matchIfMissing = false)
public OrderedHiddenHttpMethodFilter hiddenHttpMethodFilter() {
return new OrderedHiddenHttpMethodFilter();
}
matchIfMissing=false…
这句话的意思就是如果不配置的话,默认不加载此类
上网查资料的时候,都说SpringBoot给我们自动配置好了HiddenHttpMethodFilter
楼主SpringBoot版本是2.2.0,可能是版本高了之后默认配置改了的原因。
解决办法:在application.xml中添加配置
spring.mvc.hiddenmethod.filter.enabled=true
重启项目,点击修改,进入updateUser方法。