0

我需要将查询字符串参数传递给 Spring 命令 bean。我刚刚尝试了以下解决方法。

<c:if test="${not empty param.id}">
    <form:input path="id"/>
</c:if>

令我惊讶的是,它会自动将查询字符串(类似于http://localhost:8080/xxx/aaa.htm?id=100)上提供的值设置为相应的命令 bean。这正是我想要实现的目标,但我完全不知道为什么会发生这种情况。

为什么以及如何自动将参数设置为命令 bean 的相应属性?


在命令 bean 中,此参数映射到类型为 的属性java.lang.Long。因此,如果我将此参数修改为不表示为类似 的Long值的值xxx,那么我希望它会导致引发适当的异常,但事实并非如此。

如果我尝试传递一个不是Long值的字符串(如xxx),那么它会导致 - HTTP 状态 400,

客户端发送的请求在语法上不正确。

我很不确定这种行为。为什么会这样?


当用户在不表示为的 URL 中更改此参数时Long,我想显示适当的用户友好错误消息。为此,我注册了几个自定义属性编辑器(它们按原样工作),但是为了让 Spring 从属性文件中显示适当的错误消息,应该引起适当的异常,然后由 Spring 使用该异常和适当的错误显示来自属性文件的消息。

我正在使用 Spring 框架 3.2.0。


编辑:

问题的第二部分(HTTP 状态为 400 的部分)中的问题已解决。这是因为我没有收到与Spring 控制器类中的 HTTP 请求BindingResult映射的方法中的参数,这是必要的,例如,GET

@RequestMapping(method={RequestMethod.GET}, value={"admin_side/Country"})
private String showForm(@ModelAttribute("countryBean") CountryBean command, BindingResult errors, Map model)
{
     //...
}

BindingResult errors参数先前丢失,因此无法报告错误。它现在按预期工作。


一个问题仍然存在,就像我真的不明白的第一部分一样。为什么以及如何将此查询字符串参数id绑定到 Spring 命令 bean(自动)?请告诉我。

4

1 回答 1

1

这就是命令 bean 的全部意义所在:包含请求中发送的参数。自 Struts 1 以来,与表单/命令对象的参数绑定一直是 MVC 框架的核心。以下是相关文档部分

16.3.3.1 支持的方法参数类型

以下是支持的方法参数:

  • [...]
  • 命令或表单对象将请求参数绑定到 bean 属性(通过设置器)或直接绑定到字段,具有可自定义的类型转换,具体取决于 @InitBinder 方法和/或 HandlerAdapter 配置。请参阅 RequestMappingHandlerAdapter 上的 webBindingInitializer 属性。默认情况下,此类命令对象及其验证结果将作为模型属性公开,使用命令类类名称 - 例如,模型属性“orderAddress”用于“some.package.OrderAddress”类型的命令对象。ModelAttribute 注释可用于方法参数以自定义使用的模型属性名称。
于 2013-03-10T08:15:12.413 回答