0

0

SpringBoot @InitBinder注解绑定请求参数的方法是什么

WBOY

WBOY

发布时间:2023-05-11 13:31:06

|

944人浏览过

|

来源于亿速云

转载

    一. 作用

    作用于controller层中,在controller层的方法执行前执行,主要作用是初始化当前controller层的数据绑定器(或者属性绑定器),帮助完成数据处理和数据绑定。

    被该注解修饰的方法会有一个形参WebDataBinder,可以帮我们将request请求中的参数处理绑定到JavaBean中。

    SpringBoot @InitBinder注解绑定请求参数的方法是什么

    二. 前期准备

    import lombok.Data;
    
    import java.math.BigDecimal;
    import java.util.Date;
    
    @Data
    public class Test16Form {
    
        private String name;
    
        private String sex;
    
        private Date birthday;
    
        private BigDecimal money;
    }

    三. Get请求 + URL传值处理

    3.1 前台-test16.html

    
    
    
        
        Title
    
    
    

    3.2 Controller层

    StringTrimmerEditorCustomDateEditor是框架自带的属性处理器

    import org.springframework.beans.propertyeditors.CustomDateEditor;
    import org.springframework.beans.propertyeditors.StringTrimmerEditor;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.WebDataBinder;
    import org.springframework.web.bind.annotation.*;
    import org.springframework.web.servlet.ModelAndView;
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    @Controller
    @RequestMapping("/test16")
    public class Test16Controller {
    
        @InitBinder
        public void formBinder(WebDataBinder binder) {
    
            // 只要是String类型,就去除字符串前后的空格
            binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
    
            // 只有当属性名为birthday且为Date类型的才使用使用框架自带的CustomDateEditor编辑器将String处理为Date
            DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            binder.registerCustomEditor(Date.class, "birthday", new CustomDateEditor(df, true));
        }
    
        @GetMapping("/init")
        public ModelAndView init() {
    
            ModelAndView modelAndView = new ModelAndView();
            modelAndView.setViewName("test16");
            return modelAndView;
        }
    
        @GetMapping("/receiveGet")
        @ResponseBody
        public void receiveGet(Test16Form form) {
    
            System.out.println(form);
        }
    }

    3.3 效果

    • 字符串两端的空格被去除

    • String格式的日期被转换为Date格式的日期

    SpringBoot @InitBinder注解绑定请求参数的方法是什么

    四. Post请求 + 表单传值 + 自定义日期属性绑定器

    4.1 前台-test16.html

    表单提交的数据若包含List这种数据结构
    在前台需要用 form对应的属性名[下标].实体类属性名 这种方式准备数据

    
    
    
        
        Title
    
    
    

    4.2 form实体类

    import lombok.Data;
    
    import java.math.BigDecimal;
    import java.util.Date;
    import java.util.List;
    
    @Data
    public class Test16Form {
    
        private String name;
    
        private String sex;
    	
    	// 待转换类型
        private Date birthday;
    
        private BigDecimal money;
    
        private List tableList;
    }
    import lombok.Data;
    import java.util.Date;
    
    @Data
    public class Test4Entity {
    
        private String id;
    
        private String address;
    
        private String hobby;
    	
    	// 待转换类型
        private Date workDate;
    }

    4.3 Controller层

    我们可以通过PropertyEditorSupport类来实现我们自己的属性编辑器

    import org.springframework.beans.propertyeditors.StringTrimmerEditor;
    import org.springframework.stereotype.Controller;
    import org.springframework.util.ObjectUtils;
    import org.springframework.web.bind.WebDataBinder;
    import org.springframework.web.bind.annotation.*;
    import org.springframework.web.servlet.ModelAndView;
    import java.beans.PropertyEditorSupport;
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    @Controller
    @RequestMapping("/test16")
    public class Test16Controller {
    
        @InitBinder
        public void formBinder(WebDataBinder binder) {
    
            // 只要是String类型,就去除字符串前后的空格
            binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
    
            // 自定义日期转换属性处理器
            binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
    
                @Override
                public void setAsText(String dateStr) {
                    DateFormat dateFormat = null;
                    try {
                        if (ObjectUtils.isEmpty(dateStr)) {
                            setValue(dateStr);
                            return;
                        }
    
                        // yyyy-MM-dd HH:mm:ss格式
                        if (dateStr.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$")) {
                            dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                        }
                        // yyyy年MM月dd日 HH:mm:ss格式
                        else if (dateStr.matches("^\\d{4}年\\d{1,2}月\\d{1,2}日 {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$")) {
                            dateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
                        }
    
                        if (ObjectUtils.isEmpty(dateFormat)) {
                            setValue(null);
                            return;
                        }
    
                        Date parse = dateFormat.parse(dateStr);
                        setValue(parse);
    
                    } catch (Exception ex) {
                        setValue(null);
                    }
                }
            });
        }
    
        @GetMapping("/init")
        public ModelAndView init() {
    
            ModelAndView modelAndView = new ModelAndView();
            modelAndView.setViewName("test16");
            return modelAndView;
        }
    
        @PostMapping("/receivePost")
        @ResponseBody
        public void receivePost(Test16Form form) {
            System.out.println(form);
        }
    }

    4.4 效果

    • 可以看到 yyyy-MM-dd HH:mm:ss 和 yyyy年MM月dd日 HH:mm:ss 格式的字符串日期都被转换为Date数类型

    • 因为没有指定转换特定的属性名所对应的数据,所以包括一览中的数据也被成功转换

    • 一览中的字符换的前后空白也被清除,一览中的日期格式的也被成功转换

      Magician
      Magician

      Figma插件,AI生成图标、图片和UX文案

      下载

    SpringBoot @InitBinder注解绑定请求参数的方法是什么

    五. 其他自定义属性编辑器实例

    5.1 自定义SexPropertyEditor

    对性别进行编辑,如果性别为空或者不为男性或者女性,默认设置为男性

    import org.springframework.util.ObjectUtils;
    
    import java.beans.PropertyEditorSupport;
    import java.util.Arrays;
    import java.util.List;
    
    public class SexPropertyEditor extends PropertyEditorSupport {
    
        private final static List sexList = Arrays.asList("男", "女");
    
        @Override
        public void setAsText(String sex) {
    
            // 当性别为空或者不是男或女的时候,默认设置为男性
            if(ObjectUtils.isEmpty(sex) || !sexList.contains(sex)) {
                setValue("男");
                return;
            }
    
            setValue(sex);
        }
    }

    5.2 自定义StringToListPropertyEditor

    将参数中的属性名=XXX-XXX-XXX的数据转换为数组

    import org.springframework.util.ObjectUtils;
    
    import java.beans.PropertyEditorSupport;
    
    public class StringToListPropertyEditor extends PropertyEditorSupport {
    
        @Override
        public void setAsText(String text){
    
            if (ObjectUtils.isEmpty(text) || !text.contains("-")) {
                setValue(text);
                return;
            }
            setValue(text.split("-"));
        }
    }

    5.3 form实体类

    Test16Form01.java

    import lombok.Data;
    
    @Data
    public class Test16Form01 {
    
        private String sex;
    
        private String[] numList;
    
        private String[] addList;
    }

    5.4 前端

    const url = `/test16/receiveNumListAndSex?sex=不明&numList=1-2-3&addList=4-5-6`;
    $.ajax({
        url,
        type: 'GET',
        success: function (data, status, xhr) {
            console.log(data);
        }
    });

    5.5 Controller层

    @Controller
    @RequestMapping("/test16")
    public class Test16Controller {
    
        @InitBinder
        public void formBinder(WebDataBinder binder) {
    
            // 当数据类型为String[],且 属性名为 numList 的时候才会起作用
            // 虽然addList也是String[]格式的数据,但是我们并没有指定转换此属性
            binder.registerCustomEditor(String[].class, "numList", new StringToListPropertyEditor());
            
            // 当数据类型为String 且 属性名为 sex 的时候才会起作用
            binder.registerCustomEditor(String.class, "sex", new SexPropertyEditor());
        }
        
        @GetMapping("/receiveNumListAndSex")
        @ResponseBody
        public void receiveNumList(Test16Form01 form) {
            System.out.println(form);
        }
    }

    5.6 效果

    SpringBoot @InitBinder注解绑定请求参数的方法是什么

    六. 多个@InitBinder注解修饰的方法

    • 如果@InitBinder注解没有添加value值,则每个请求都会走被其修饰的方法

    • 如果@InitBinder注解有value值,则只有参数的名称与其相同才会走此方法

    import com.example.jmw.common.bindEditor.SexPropertyEditor;
    import com.example.jmw.common.bindEditor.StringToListPropertyEditor;
    import org.springframework.beans.propertyeditors.StringTrimmerEditor;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.WebDataBinder;
    import org.springframework.web.bind.annotation.*;
    import org.springframework.web.servlet.ModelAndView;
    
    @Controller
    @RequestMapping("/test16")
    public class Test16Controller {
    
        // 注解没有添加value值,每个请求都会走此方法
        @InitBinder
        public void init(WebDataBinder binder) {
            binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
        }
    
        // 指定只有参数名称为test16Form01的,才会走此方法
        @InitBinder("test16Form01")
        public void formBinder(WebDataBinder binder) {
            // 当数据类型为String 且 属性名为 sex 的时候才会起作用
            binder.registerCustomEditor(String.class, "sex", new SexPropertyEditor());
        }
    
        // 指定只有参数名称为test16Form的,才会走此方法
        @InitBinder("test16Form")
        public void receiveGetBinder(WebDataBinder binder) {
            // 当数据类型为String[],且 属性名为 numList 的时候才会起作用
            binder.registerCustomEditor(String[].class, "numList", new StringToListPropertyEditor());
        }
    
        @GetMapping("/receiveGet")
        @ResponseBody
        public void receiveGet(Test16Form form) {
    
            System.out.println(form);
        }
    
        @GetMapping("/receiveNumListAndSex")
        @ResponseBody
        public void receiveNumList(Test16Form01 form) {
            System.out.println(form);
        }
    }

    SpringBoot @InitBinder注解绑定请求参数的方法是什么

    七. 其他用法

    • 当前Controller继承父类,在父类中使用@InitBinder注解来修饰的方法

    • 配合@ControllerAdvice注解作用于全局

    相关专题

    更多
    Java 桌面应用开发(JavaFX 实战)
    Java 桌面应用开发(JavaFX 实战)

    本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

    37

    2026.01.14

    php与html混编教程大全
    php与html混编教程大全

    本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

    19

    2026.01.13

    PHP 高性能
    PHP 高性能

    本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

    37

    2026.01.13

    MySQL数据库报错常见问题及解决方法大全
    MySQL数据库报错常见问题及解决方法大全

    本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

    19

    2026.01.13

    PHP 文件上传
    PHP 文件上传

    本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

    16

    2026.01.13

    PHP缓存策略教程大全
    PHP缓存策略教程大全

    本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

    6

    2026.01.13

    jQuery 正则表达式相关教程
    jQuery 正则表达式相关教程

    本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

    3

    2026.01.13

    交互式图表和动态图表教程汇总
    交互式图表和动态图表教程汇总

    本专题整合了交互式图表和动态图表的相关内容,阅读专题下面的文章了解更多详细内容。

    45

    2026.01.13

    nginx配置文件详细教程
    nginx配置文件详细教程

    本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

    9

    2026.01.13

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    Redis6入门到精通超详细教程
    Redis6入门到精通超详细教程

    共47课时 | 5.2万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号