WebBindingInitializer类的使用方法

此类能够将前端传入的参数转换成你需要的格式

例如:需求为,前端传入一个时间戳的,后端是一个Date类型。
SpringMvc无法将String类型转换成Date。即可时间WebBingdingInitializer类。

使用方式

  • 局部配置(在当前Controller配置,作用范围在此类中)
  • 全局配置

局部配置

1、在响应的Controller中创建方法并,在方法中添加@InitBinder(value="paramName")注解,注解中的value=参数名称。 只在此Controller中有效。@RestController@RequestMapping("/user")public class UserController {    @GetMapping("/t")    public Object t(Date date1, String id) {        System.out.println("id: "+id);        System.out.println(date1);        return date1;    }        //  参数名称为date1的    @InitBinder(value="date1")    public void t(WebDataBinder binder) {        //  绑定类型,后端接收的数据类型为Date.class        binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {                    //  当前端发送字符串的时间戳,后端接收数据时, 通过此方法将字符串转成Date类型            @Override            public void setAsText(String text) throws IllegalArgumentException {                setValue(new Date(Long.decode(text)));            }            //  当后端返回给前端时,会将Date类型转成字符串,返回给前端。            @Override            public String getAsText() {                return getValue().toString();            }        });    }}


全局配置

1、配置资源修改支持, 编写规则public class MyCustomDateEditor extends PropertyEditorSupport {    /**     * @see java.beans.PropertyEditorSupport#setAsText(java.lang.String)     * 前端传入的是unix时间戳,也就是long型,然后后台接收到前端传入的这个参数时会先被转换为String类型,     * 默认情况下,是不能将String转为Date类型的,所以我们再这里将String字符串变为Date类型!     */    @Override    public void setAsText(String text) throws IllegalArgumentException {        setValue(new Date(Long.decode(text)));    }    /**     * @see java.beans.PropertyEditorSupport#getAsText()     * 后台给前端返回响应信息,也要处理Date类型,将Date类型转为String.     */    @Override    public String getAsText() {        Date value = (Date) getValue();        return (value != null ? String.valueOf(TimeUnit.MILLISECONDS.toSeconds(value.getTime())) : "");    }}2、自定义WebBindingInitializer/** * @Description 扩展web初始化的配置,WebBindingInitializer实现全局属性编辑器配置 * @Author 一一哥Sun * @Date Created in 2020/3/24 */public class CustomDateWebBindingInitializer implements WebBindingInitializer {    @Override    public void initBinder(WebDataBinder binder) {        //  设置时间        binder.registerCustomEditor(Date.class, new MyCustomDateEditor());    }}3、将自定义的WebBingdingInitializer配置到所有请求中@Configurationpublic class CustomDateEditorConfiguration {    @Autowired    public void setWebBindingInitializer(RequestMappingHandlerAdapter requestMappingHandlerAdapter) {        //将自定义的CustomDateWebBindingInitializer属性编辑器绑定到RequestMappingHandlerAdapter里面.        requestMappingHandlerAdapter.setWebBindingInitializer(new CustomDateWebBindingInitializer());    }}



总结

  • 局部配置:针对只有个别接口需要转换类型的,可使用局部配置
  • 全局配置:针对所有接口,需要指定某个类型转换成指定的类型时,可使用全局配置。


注意:如果全局和局部都配置了,是使用全局配置,局部配置不生效。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章