将查询字符串参数提供给Spring中的命令bean

时间:2013-03-10 01:49:45

标签: spring spring-mvc

我需要将查询字符串参数传递给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的{​​{1}}值的值,那么我希望它会导致引发适当的异常,但事实并非如此。

如果我尝试传递的字符串不是xxx值(如Long),则会产生 - HTTP状态400,

  

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

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


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

我正在使用Spring框架3.2.0。


修改

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

GET

之前缺少@RequestMapping(method={RequestMethod.GET}, value={"admin_side/Country"}) private String showForm(@ModelAttribute("countryBean") CountryBean command, BindingResult errors, Map model) { //... } 参数,因此无法报告错误。它现在按预期工作。


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

1 个答案:

答案 0 :(得分:1)

这就是命令bean的重点:包含请求中发送的参数。自Struts 1以来,对表单/命令对象的参数绑定是MVC框架的核心。这是相关的documentation section

  

16.3.3.1支持的方法参数类型

     

以下是受支持的方法参数:

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