Spring MVC绑定参数到后台对象

时间:2009-10-28 23:43:34

标签: java model-view-controller spring spring-mvc

我正在使用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。

感谢。

6 个答案:

答案 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的新实例。

  • controller负责将请求参数映射到POJO字段。
  • 如果映射不适合您,则覆盖formBackingBean()或onBind()方法以读取请求参数并将值放入POJO。

答案 5 :(得分:0)

您应该更改表单或对象,以便名称匹配。如果您尝试在Spring MVC等框架中使用这些功能,那么您应该遵循它们的约定。

约定优于配置。