我需要将查询字符串参数传递给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(自动)?请告诉我。
答案 0 :(得分:1)
这就是命令bean的重点:包含请求中发送的参数。自Struts 1以来,对表单/命令对象的参数绑定是MVC框架的核心。这是相关的documentation section:
16.3.3.1支持的方法参数类型
以下是受支持的方法参数:
- [...]
- 命令或表单对象,用于将请求参数绑定到bean属性(通过setter)或直接绑定到字段,具有可自定义的类型转换,具体取决于@InitBinder方法和/或HandlerAdapter配置。请参阅RequestMappingHandlerAdapter上的webBindingInitializer属性。默认情况下,使用命令类类名称 - 例如,此类命令对象及其验证结果将作为模型属性公开。 “some.package.OrderAddress”类型的命令对象的model属性“orderAddress”。可以在方法参数上使用ModelAttribute批注来自定义使用的模型属性名称。