关于SpringBoot的PUT提交不生效

在使用SpringBoot进行RESTful API开发时,遇到PUT请求不生效的问题,文章详细介绍了如何通过配置HiddenHttpMethodFilter来解决PUT请求被误识别为POST的问题。

最近修改控制器的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方法。

进入updateUser方法

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值