0
@InitBinder
public void initBinder(WebDataBinder binder) {
    this.binder = binder;
}

处理普通请求时可以调用该函数,但如果第一个请求是ajax请求

@RequestMapping("create")
@ResponseBody
public String create(@RequestBody String body) {
    JSONObject result = new JSONObject();
    try{
        JSONObject params = new JSONObject(body);
        T t = buildEntity(params);
        service().save(t);
        result.put(ExtConstant.DATA, t.detailJson());
        result.put(ExtConstant.SUCCESS, true);
    }catch(Exception e){
        result.put(ExtConstant.SUCCESS, false);
        result.put(ExtConstant.ERROR_MSG, e.getMessage());
        e.printStackTrace();
    }
    return result.toString();
}

未调用函数 initBinder,binder 为空。这真的让我很困惑

4

1 回答 1

2

是的,这是正确的行为 -@InitBinder仅在解析需要绑定的参数时才调用带注释的方法,因此在您的情况下,如果您有一个带有参数的@RequestMapping/@ModelAttribute方法,例如需要绑定的命令/模型对象,那么@InitBinder将被调用。

在这种特定情况下,您的create方法有一个带有注释的参数主体@RequestBody,该参数不是由绑定器而是由 MessageConverters(从 json/xml 到适当的类型)解析的,因此@InitBinder不会调用该方法。

于 2012-09-19T00:19:41.900 回答