SpringMvc 参数绑定自定义对象

springmvc我们经常在写controller一般都接受两种方式,一种是form提交,一种是json提交,下面就来介绍如何在这两种方式中将提交的数据自动绑定到自定义对象中。

json提交

这个比较简单,在网上搜一下一大把,这里就简单放一段代码:

@RequestMapping("/testjson")
public String testjson(@RequestBody User user){
    return "ok";
}

form提交

这个是比较头疼的,一般form有很多的参数,我们可以像下面这样写:

@RequestMapping("/test")
public String testParam(@RequestParam(name = "name") String name, @RequestParam(name = "sex") String sex) {
    return name + sex;
}

但是如果我改成下面这样会怎么样?然后用form提交参数 name=zack & sex=boy

@RequestMapping("/test")
public String test(@RequestParam(name = "user") User user) {
    return user.getName();
}

结果是报错:

{
"timestamp": "2018-05-29T11:58:37.450+0000",
"status": 400,
"error": "Bad Request",
"message": "Required User parameter 'user' is not present",
"path": "/test1"
}

我的参数里确实是没有user这个,其实我的原本目的是想让spring把我传递的name和sex熟悉拼装好生成一个user对象,因为刚好user对象就有这2个属性,spring可没有智能。那该怎么办?

这个时候引入WebDataBinder, 在你的controller里加上下面的代码:

@InitBinder
protected void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(User.class, new UserFormatEditor());
}
public static class UserFormatEditor extends PropertiesEditor {
    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        setValue(JSONObject.parseObject(text, User.class));
    }

    @Override
    public String getAsText() {
        return getValue().toString();
    }
}

然后在请求时将参数改为 user = {"name":"zack","sex":"boy"} ,之后就成功的获取User对象,WebDataBinder帮我们告诉了spring,如果遇到了一个字符串参数要被包装成User.class,用我们自定义的UserFormatEditor就行。

总结

作为规范而言,form提交的方式本身就需要我们一个一个属性的接收,而不能用一个对象统一接收,如果你想用一个对象统一接收,请采用json的方式提交。

 

欢迎关注我的个人的博客www.zhijianliu.cn, 虚心求教,有错误还请指正轻拍,谢谢

版权声明:本文出自志健的原创文章,未经博主允许不得转载

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章