Tomcat 8 上 Spring 编辑表单的 POST 失败,出现 405,而在 tomcat 7 上工作

Posted

技术标签:

【中文标题】Tomcat 8 上 Spring 编辑表单的 POST 失败,出现 405,而在 tomcat 7 上工作【英文标题】:POST of Spring edit form on Tomcat 8 fails with 405 while on tomcat 7 works 【发布时间】:2015-05-24 07:16:58 【问题描述】:

在编辑表单中设置无效值(大于长限制的值)会导致在 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"

有什么想法吗?

【问题讨论】:

【参考方案1】:

Long 的最大值为 9223372036854775807。您的数字大于它。 尝试将BigDecimal 作为参数或将其获取为字符串,然后将其解析为BigDecimal

【讨论】:

嗨 Evgeni,我知道它更大。这就是为什么我希望更新表单中出现验证错误消息(如 tomcat 7 所示)而不是 tomcat 8 中显示的 405 页面。问题是如何在 tomcat 8 上获得该验证消息以及为什么我得到 405 (请求是 POST)而不是验证消息。 @Chris 您的验证是如何组织的? Hibernate 验证器,Spring 验证器,客户端?你能把它添加到问题中吗? 该字段没有任何验证约束。 Spring 绑定机制无法将输入字符串转换为 Long 并以验证错误格式在字段下方显示抛出的异常消息【参考方案2】:

最后我发现原因与 Spring 根据隐藏字段 _method(在 HiddenHttpMethodFilter,参见 [1])将请求从 POST 更改为 PUT 但从未将其更改回之前的事实有关方法。因此,当请求显示更新表单以及验证或绑定错误消息时,转发 Spring 会执行 (InternalResourceView),包含包装请求,该请求的方法被覆盖为 PUT,因此被拒绝雄猫 >= 8。

一个好的方法似乎是使用手动过滤器,它将方法更改为 GET on FORWARD [2]、[3]

[1]HTTP Status 405 - JSPs only permit GET POST or HEAD

[2]405 JSP error with Put Method

[3]https://jira.spring.io/browse/SPR-12848

【讨论】:

以上是关于Tomcat 8 上 Spring 编辑表单的 POST 失败,出现 405,而在 tomcat 7 上工作的主要内容,如果未能解决你的问题,请参考以下文章

在 Spring Boot 上更改嵌入式 tomcat 版本

在tomcat 8上部署战争时未加载Spring Boot应用程序

Spring Boot 在 Tomcat 8.5.x 但不在 8.0.37 上运行 java.lang.NoClassDefFoundError: org/apache/coyote/UpgradeP

在 WildFly 8.0.0.Beta 1 上部署 spring 应用程序错误

Spring Boot 过滤器顺序:WebLogic 12c vs Tomcat 8

关于springBoot初试tomcat容器认证之表单验证