@InitBinder public void initBinder(WebDataBinder binder){ binder.registerCustomEditor(String.class,new StringTrimmerEditor(true)); binder.registerCustomEditor(Date.class,new CustomDateEditor()); } @PostMapping("test") public void test(AstAssetVO astAssetVO,String assetNo){ System.err.println("test:"+JSON.toJSONString(astAssetVO)); System.err.println("test:"+assetNo); } @PostMapping("test2") public void test2(AstAssetVO astAssetVO, String assetNo, Date beginExpireDate){ System.err.println("test2"+JSON.toJSONString(astAssetVO)); System.err.println("test2"+assetNo); System.err.println("test2"+beginExpireDate); }
@InitBinder标注的方法执行是多次的,一次请求来就执行一次(第一次惩罚)
Controller实例中的所有@InitBinder只对当前所在的Controller有效
@InitBinder的value属性控制的是模型Model里的key,而不是方法名(不写代表对所有的生效)
@InitBinder标注的方法不能有返回值(只能是void或者returnValue=null)
@InitBinder对@RequestBody这种基于消息转换器的请求参数无效
1. 因为@InitBinder它用于初始化DataBinder数据绑定、类型转换等功能,而@RequestBody它的数据解析、转换时消息转换器来完成的,所以即使你自定义了属性编辑器,对它是不生效的(它的WebDataBinder只用于数据校验,不用于数据绑定和数据转换。它的数据绑定转换若是json,一般都是交给了jackson来完成的)
只有AbstractNamedValueMethodArgumentResolver才会调用binder.convertIfNecessary进行数据转换,从而属性编辑器才会生效