【问题标题】:any way to get BindingResult for @RequestParam?有什么方法可以为@RequestParam 获取 BindingResult?
【发布时间】:2012-02-19 14:38:12
【问题描述】:

我正在使用 Spring 3 Portlet MVC。仅 MVC 中的验证/绑定应该是相同的。

我只有一个 int 表单域。当我在做的时候

void doSmth(MyForm form, BindingResult bindingResult) throws ... {
  int bindErrors = bindingResult.getErrorCount())
  ...

并提交一个无法解析为 int 的字段值,此方法被执行,bindErrors 为 1。此方法接收的表单字段值为 0。太好了。

但是创建一个只包含单个字段的表单并不好。

我将代码更改为:

void doSmth(@RequestParam int userId, BindingResult bindingResult) ... {
  int bindErrors = bindingResult.getErrorCount())
  ...

并在浏览器中收到 Portlet 不可用 消息和此异常:

org.springframework.web.portlet.FrameworkPortlet processRequest 可以 未完成请求 org.springframework.beans.TypeMismatchException:转换失败 “java.lang.String”类型的值到所需类型“int”;嵌套的 异常是 java.lang.NumberFormatException:对于输入字符串:“q”

问题:即使@RequestParam 类型转换失败,是否有任何方法可以继续执行方法并处理其中的绑定错误?我尝试使 @RequestParam 不需要并为其提供默认值 - 没有帮助。

【问题讨论】:

    标签: java spring spring-mvc validation


    【解决方案1】:

    Spring 引用只允许 BindingResult 用于命令或表单对象。

    org.springframework.validation.Errors / org.springframework.validation.BindingResult 对前面的命令或表单对象(前面的方法参数)的验证结果。

    (15.3.2.3 Supported handler method arguments and return types)

    所以你可能需要自己实现它。

    或者你将你的单个 int 包装在一个命令对象中,然后在这个对象上使用绑定结果(可以在这里找到一个示例:https://stackoverflow.com/a/13407434/280244

    【讨论】:

    • 好吧,如果它不支持开箱即用,那么我想我可以使用单值 bean,谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    • 2011-12-02
    相关资源
    最近更新 更多