当前位置:

首页 > 编程开发 > SpringBoot @InitBinder注解绑定请求参数的方法是什么

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

一.作用作用于Controller层中,在Controller层的方法执行前执行,主要作用是初始化当前Controller层的数据绑定器(或者属性绑定器),帮助完成数据处理和数据绑定。被该注解修饰的方法会有一个形参WebDataBinder,可以帮我们将request请求中的参数处理绑定到JavaBean中。二.前期准备importlombok.Data;importjava.math.BigDecimal;importjava.util.Date;@DatapublicclassTest16Form{p

本文目录

      一. 作用

      作用于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
      
      
      
          发送get请求

      3.2 Controller层

      StringTrimmerEditor和CustomDateEditor是框架自带的属性处理器

      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
      
      
      
          发送post请求

      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数类型

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

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

      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注解作用于全局

      本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
      作者最新文章
      编程开发
      相关文章 更多
      springBoot项目常用目录有哪些
      springBoot项目常用目录有哪些

      springBoot项目常用目录springBoot项目的目录结构及名规范介绍基于SpringBoot开发时的目录结构及命名规范,通过介绍能够为你解决,在实际项目中如何规划目录结构?如何命名目录更规范?各个目录分别代表什么含义?等三个问题。目录说明servicex//项目名|-admin-ui//管理服务前端代码(一般将UI和SERVICE放到一个工程中,便于管理)|-servicex-auth//模块1|-servicex-common//模块2|-servicex-gateway//模块3|-serv

      解析SpringBoot和SpringMVC之间的异同
      解析SpringBoot和SpringMVC之间的异同

      解析SpringBoot和SpringMVC之间的异同SpringBoot和SpringMVC是Java领域中非常重要的开发框架。虽然它们都属于Spring框架的一部分,但是在使用和功能上有一些明显的区别。本文将对SpringBoot和SpringMVC进行比较,解析它们之间的异同。首先,让我们来了解一下SpringBoot。SpringBo

      探索SpringCloud和SpringBoot在微服务领域的不同应用方式
      探索SpringCloud和SpringBoot在微服务领域的不同应用方式

      近年来,随着云计算和分布式架构的兴起,微服务架构的应用越来越广泛。而SpringCloud和SpringBoot作为Java开发中的两个重要框架,对于微服务的实现起到了重要的作用。然而,很多人对于它们在微服务领域的不同应用方式还存在一定的疑惑。本文将从不同的角度探索SpringCloud和SpringBoot在微服务中的应用方式。首先,我们来了解一下Spri

      SpringBoot和SpringMVC有何区别?
      SpringBoot和SpringMVC有何区别?

      SpringBoot与SpringMVC的不同之处在哪里?SpringBoot和SpringMVC是两个非常流行的Java开发框架,用于构建Web应用程序。尽管它们经常分别被使用,但它们之间的不同之处也是很明显的。首先,SpringBoot可以被看作是一个Spring框架的扩展或者增强版。它旨在简化Spring应用程序的初始化和配置过程,以帮助开发人

      比较SpringBoot和SpringMVC的异同
      比较SpringBoot和SpringMVC的异同

      SpringBoot和SpringMVC都是Java开发中常用的框架,但它们之间有一些明显的差异。本文将探究这两个框架的特点和用途,并对它们的差异进行比较。首先,我们来了解一下SpringBoot。SpringBoot是由Pivotal团队开发的,它旨在简化基于Spring框架的应用程序的创建和部署。它提供了一种快速、轻量级的方式来构建独立的、可执行

      SpringBoot与SpringMVC的不同点是什么?
      SpringBoot与SpringMVC的不同点是什么?

      SpringBoot和SpringMVC是Java开发中常用的两个框架,它们都是由Spring框架所提供的,但在功能和使用方式上有着一些区别。本文将分别介绍SpringBoot和SpringMVC的特点和区别。一、SpringBoot的特点:简化配置:SpringBoot通过约定优于配置的原则,大大简化了项目的配置过程。它可以自动配置项目所需要的参数,开发人

      比较和选择指南:SpringCloud与SpringBoot的功能比较
      比较和选择指南:SpringCloud与SpringBoot的功能比较

      SpringCloud和SpringBoot是目前Java领域中最热门的开源框架,它们分别提供了一套完善的微服务架构和快速构建应用程序的解决方案。本文将对它们的功能进行比较,并给出选择指南,以帮助读者了解它们的优势和适用场景。SpringBoot是一个用于开发Java应用程序的框架,它提供了一个简化的开发流程,集成了大量常用的功能和组件,减少了开发者的工作量

      SpringCloud与SpringBoot:分析它们之间的相似与不同
      SpringCloud与SpringBoot:分析它们之间的相似与不同

      深入剖析SpringCloud和SpringBoot的异同引言:在构建企业级应用程序时,Spring框架已经成为开发者们的首选。它提供了一种简单而强大的方式来构建独立于平台的应用程序。Spring框架由两个核心模块组成:SpringBoot和SpringCloud。虽然它们都可以帮助开发者快速搭建应用程序,但它们的目标和用途存在一些差异。本文将深入剖析Spr

      从架构角度看SpringCloud与SpringBoot的差异
      从架构角度看SpringCloud与SpringBoot的差异

      从架构角度看SpringCloud与SpringBoot的差异引言:在当今的互联网时代,构建分布式系统已经成为了一种必要的需求。而SpringBoot和SpringCloud正是为了满足这个需求而诞生的。尽管它们都是由Spring框架所提供的解决方案,但从架构角度来看,它们存在着一些重要的差异。本文将从架构的角度出发,对SpringBoot和SpringCl

      Java API 开发中使用 SpringBoot 的利弊分析
      Java API 开发中使用 SpringBoot 的利弊分析

      JavaAPI开发中使用SpringBoot的利弊分析随着互联网的快速发展和技术的不断更新迭代,Java技术在开发中的广泛应用引起了人们的重视。而SpringBoot作为一种微服务架构的解决方案,已经逐渐成为Java开发中的热门选择。那么,在JavaAPI开发中使用SpringBoot,到底有哪些利弊呢?下面来分析一下。利:简化开发

      查看更多
      精品专题 更多
      装机必备
      装机必备

      正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

      Windows
      Windows

      正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

      PDF教程
      PDF教程

      正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

      Mac软件 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      Aperty macOS版
      Aperty macOS版
      macOS

      Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

      WINDOWS 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      PixTV 网页版
      PixTV 网页版
      Windows

      PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。