我正在使用Spring MVC,在我的控制器中,我希望能够自动将传入参数绑定到我的Java对象。看起来这应该很容易做到。唯一的问题是传入的参数名称(例如“用户名”)可能与java对象中的字段名称不完全匹配(例如“name”)。
从Spring文档(http://static.springsource.org/spring/docs/2.5.6/reference/mvc.html):
“Spring Web MVC允许您使用任何 对象作为命令或表单对象.... 这一切都意味着你不需要 复制您的业务对象' 属性为简单的无类型字符串 在你的表单对象中只是为了能够 处理无效的提交,或 正确转换字符串。代替, 它通常比较好 直接到您的业务对象。 “
我该如何实际做到这一点?任何代码或链接都赞赏。
例如,我的业务对象
public class User {
private String username;
private String password;
//getters and setter
}
我的控制器正在处理的请求:
example.com/login?name=Steve&pw=1234
我想将“Steve”绑定到User.username并将“1234”绑定到User.password。
感谢。
答案 0 :(得分:1)
如果我没记错的话,您可以覆盖public Object formBackingObject(HttpServletRequest request)
并手动设置命令POJO。
答案 1 :(得分:1)
在这种情况下,您可以使用自定义参数解析器。
public class UserArgumentResolver implements HandlerMethodArgumentResolver {
public Object resolveArgument(final MethodParameter parameter,
final ModelAndViewContainer container,
final NativeWebRequest webRequest,
final WebDataBinderFactory binderFactory) {
final User user = new User();
user.setUsername(webRequest.getParameter("name"));
user.setPassword(webRequest.getParameter("pw"));
return user;
}
}
在你的春季配置中:
<mvc:annotation-driven>
<mvc:argument-resolvers>
<bean class="your.package.UserArgumentResolver"/>
</mvc:argument-resolvers>
</mvc:annotation-driven>
答案 2 :(得分:0)
example.com/login?username=Steven&password=1234
当属性名称不匹配时,您不能指望spring MVC执行自动绑定。那是不合逻辑的。
答案 3 :(得分:0)
编辑:做Kaleb所说的,覆盖formBackingObject更清洁。
我会留下这个说明:
但是,如果您对双方都有任何控制权,我强烈建议使名称保持一致。约定优于配置。
答案 4 :(得分:0)
如果要将请求绑定到POJO,您可能需要扩展AbstractCommandController,或者如果您有一个表单 - SimpleFormController。我相信你需要org.springframework.web.servlet.mvc包中的servlet版本。
使用setCommandClass()在控制器构造函数中设置正确的支持bean类型,即POJO:
setCommandClass(User.class);
formBackingBean()用于创建将由控制器使用的POJO的新实例。
答案 5 :(得分:0)
您应该更改表单或对象,以便名称匹配。如果您尝试在Spring MVC等框架中使用这些功能,那么您应该遵循它们的约定。
约定优于配置。