通过@InitBinder注解实现参数绑定

@InitBinder简介

@InitBinder注解是controller级别的,一个controller实例中的所有@initBinder 只对该controller有效。

@InitBinder标注的方法, 方法的参数可以有HttpServletRequest、ModelMap、WebDataBinder,一般情况下WebDataBinder就能够满足的部分的需求了。

@InitBinder标注的方法是在其匹配的Controller请求执行之前执行的。

WebDataBinder指定参数名称前缀
binder.setFieldDefaultPrefix()方法可以用来指定参数名称的前缀,可以避免两个实体参数有相同名称属性的情况下绑定错误的问题。

比如有下面两个实体A和B,它们都有相同的属性名称,在同一个Controller方法作为参数时就会出现问题

public class A {  
  Long id;  
  String test;  
}  
public class B {  
  Long id;  
  String test;  
}  

这个时候我们就可以通过binder.setFieldDefaultPrefix()方法来配置请求参数前缀,前端提交的时候使用a.test、b.test就可以了

@Controller  
@RequestMapping("/test")  
public class TestController {
    //设置参数前缀  
    @InitBinder("a")  
    public void initBinderUser(WebDataBinder binder) {  
        binder.setFieldDefaultPrefix("a.");  
    }  
 
    @InitBinder("b")  
    public void initBinderAddr(WebDataBinder binder) {  
        binder.setFieldDefaultPrefix("b.");  
    }  
      
    @RequestMapping("/test")  
    @ResponseBody  
    public Map<String,Object> test(@ModelAttribute("a") A a, @ModelAttribute("b") B b) {  
		......
    }

WebDataBinder注入自定义类型转换
binder.registerCustomEditor()方法可以实现自定义类型数据绑定,实现方式参考文章: Controller层接收Date类型参数进行统一转换

	public void registerCustomEditor(Class<?> requiredType, PropertyEditor propertyEditor) {
		getPropertyEditorRegistry().registerCustomEditor(requiredType, propertyEditor);
	}

你可能感兴趣的:(Java)