Spring 的 POST 在 Tomcat 8 上编辑表单失败并显示 405,而在 tomcat 7 上有效
POST of Spring edit form on Tomcat 8 fails with 405 while on tomcat 7 works
在编辑表单中设置无效值(大于 Long 限制的值)导致在 tomcat 8 上提交 (POST) 时出现 405。
在 tomcat 7 上的相同提交按预期工作并显示字段绑定错误:
Failed to convert property value of type java.lang.String to required type java.lang.Long for property userId; nested exception is java.lang.NumberFormatException: For input string: "56345345345345345345345345"
有什么想法吗?
Long 的最大值是 9223372036854775807。你的数字比它大。
尝试 BigDecimal
作为参数或将其作为字符串获取,然后将其解析为 BigDecimal
.
最后我发现原因与Spring根据隐藏字段_method将请求从POST更改为PUT有关(在HiddenHttpMethodFilter
上,请参阅[1]) 但永远不会将其改回以前的方法。因此,当请求更新表单与验证或绑定错误消息一起显示时,转发 Spring 执行 (InternalResourceView
),包含包装请求,该请求的方法被覆盖为 PUT 和由于这个原因被 Tomcat >= 8.
拒绝
一个好的方法似乎是使用手动过滤器,它将方法更改为 GET on FORWARD [2]、[3]
[1]
[2]405 JSP error with Put Method
在编辑表单中设置无效值(大于 Long 限制的值)导致在 tomcat 8 上提交 (POST) 时出现 405。
在 tomcat 7 上的相同提交按预期工作并显示字段绑定错误:
Failed to convert property value of type java.lang.String to required type java.lang.Long for property userId; nested exception is java.lang.NumberFormatException: For input string: "56345345345345345345345345"
有什么想法吗?
Long 的最大值是 9223372036854775807。你的数字比它大。
尝试 BigDecimal
作为参数或将其作为字符串获取,然后将其解析为 BigDecimal
.
最后我发现原因与Spring根据隐藏字段_method将请求从POST更改为PUT有关(在HiddenHttpMethodFilter
上,请参阅[1]) 但永远不会将其改回以前的方法。因此,当请求更新表单与验证或绑定错误消息一起显示时,转发 Spring 执行 (InternalResourceView
),包含包装请求,该请求的方法被覆盖为 PUT 和由于这个原因被 Tomcat >= 8.
一个好的方法似乎是使用手动过滤器,它将方法更改为 GET on FORWARD [2]、[3]
[1]
[2]405 JSP error with Put Method