从原理层面掌握@InitBinder的使用【享学Spring MVC】(中)

简介: 从原理层面掌握@InitBinder的使用【享学Spring MVC】(中)

目前方法执行的核心,无非就是对参数的解析、封装,也就是对HandlerMethodArgumentResolver的理解。强烈推荐你可以参考 这个系列的所有文章~


有了这些基础理论的支撑,接下来当然就是它的使用Demo Show


@InitBinder的使用案例


我抛出两个需求,借助@InitBinder来实现:


  1. 请求进来的所有字符串都trim一下
  2. yyyy-MM-dd这种格式的字符串能直接用Date类型接收(不用先用String接收再自己转换,不优雅)

为了实现如上两个需求,我需要先自定义两个属性编辑器:


1、StringTrimmerEditor


public class StringTrimmerEditor extends PropertyEditorSupport {
    // 将属性对象用一个字符串表示,以便外部的属性编辑器能以可视化的方式显示。缺省返回null,表示该属性不能以字符串表示
    //@Override
    //public String getAsText() {
    //    Object value = getValue();
    //    return (value != null ? value.toString() : null);
    //}
    // 用一个字符串去更新属性的内部值,这个字符串一般从外部属性编辑器传入
    // 处理请求的入参:test就是你传进来的值(并不是super.getValue()哦~)
    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        text = text == null ? text : text.trim();
        setValue(text);
    }
}


说明:Spring内置有org.springframework.beans.propertyeditors.StringTrimmerEditor,默认情况下它并没有装配进来,若你有需要可以直接使用它的(此处为了演示,我就用自己的)。Spring内置注册了哪些?参照PropertyEditorRegistrySupport#createDefaultEditors方法

Spring的属性编辑器和传统的用于IDE开发时的属性编辑器不同,它们没有UI界面,仅负责将配置文件中的文本配置值转换为Bean属性的对应值,所以Spring的属性编辑器并非传统意义上的JavaBean属性编辑器。


2、CustomDateEditor


关于这个属性编辑器,你也可以像我一样自己实现。本文就直接使用Spring提供了的,参见:org.springframework.beans.propertyeditors.CustomDateEditor


// @since 28.04.2003
// @see java.util.Date
public class CustomDateEditor extends PropertyEditorSupport {
  ...
  @Override
  public void setAsText(@Nullable String text) throws IllegalArgumentException {
    ...
    setValue(this.dateFormat.parse(text));
    ...
  }
  ...
  @Override
  public String getAsText() {
    Date value = (Date) getValue();
    return (value != null ? this.dateFormat.format(value) : "");
  }
}


定义好后,如何使用呢?有两种方式:


  1. API方式WebBindingInitializer ,关于它的使用,请参阅这里,本文略。1. 重写initBinder注册的属性编辑器是全局的属性编辑器,对所有的Controller都有效(全局的)
  2. @InitBinder注解方式


在Controller本类上使用@InitBinder,形如这样:

@Controller
@RequestMapping
public class HelloController {
    @InitBinder
    public void initBinder(WebDataBinder binder) {
        //binder.setDisallowedFields("name"); // 不绑定name属性
        binder.registerCustomEditor(String.class, new StringTrimmerEditor());
        // 此处使用Spring内置的CustomDateEditor
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
    }
    @ResponseBody
    @GetMapping("/test/initbinder")
    public String testInitBinder(String param, Date date) {
        return param + ":" + date;
    }
}


请求:/test/initbinder?param= ds&date=2019-12-12。结果为:ds:Thu Dec 12 00: 00: 00 CST 2019,符合预期。


注意,若date为null返回值为ds: null(因为我设置了允许为null)

但若你不是yyyy-MM-dd格式,那就抛错喽(格式化异常)


本例的@InitBinder方法只对当前Controller生效。要想全局生效,可以使用@ControllerAdvice/WebBindingInitializer。

通过@ControllerAdvice可以将对于控制器的全局配置放置在同一个位置,注解了@ControllerAdvice的类的方法可以使用@ExceptionHandler,@InitBinder,@ModelAttribute等注解到方法上,这对所有注解了@RequestMapping的控制器内的方法有效(关于全局的方式本文略,建议各位自己实践~)



相关文章
|
4月前
|
XML Java 开发者
Spring Boot开箱即用可插拔实现过程演练与原理剖析
【11月更文挑战第20天】Spring Boot是一个基于Spring框架的项目,其设计目的是简化Spring应用的初始搭建以及开发过程。Spring Boot通过提供约定优于配置的理念,减少了大量的XML配置和手动设置,使得开发者能够更专注于业务逻辑的实现。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,为开发者提供一个全面的理解。
69 0
|
2月前
|
SQL Java 数据库连接
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
139 29
|
3月前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
232 14
|
3月前
|
设计模式 前端开发 Java
步步深入SpringMvc DispatcherServlet源码掌握springmvc全流程原理
通过对 `DispatcherServlet`源码的深入剖析,我们了解了SpringMVC请求处理的全流程。`DispatcherServlet`作为前端控制器,负责请求的接收和分发,处理器映射和适配负责将请求分派到具体的处理器方法,视图解析器负责生成和渲染视图。理解这些核心组件及其交互原理,有助于开发者更好地使用和扩展SpringMVC框架。
74 4
|
4月前
|
Java 开发者 Spring
Spring AOP 底层原理技术分享
Spring AOP(面向切面编程)是Spring框架中一个强大的功能,它允许开发者在不修改业务逻辑代码的情况下,增加额外的功能,如日志记录、事务管理等。本文将深入探讨Spring AOP的底层原理,包括其核心概念、实现方式以及如何与Spring框架协同工作。
|
4月前
|
前端开发 Java 开发者
Spring MVC中的请求映射:@RequestMapping注解深度解析
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的关键,它将HTTP请求映射到相应的处理器方法上。本文将深入探讨`@RequestMapping`注解的工作原理、使用方法以及最佳实践,为开发者提供一份详尽的技术干货。
294 2
|
5月前
|
Java Spring 容器
Spring底层原理大致脉络
Spring底层原理大致脉络
|
5月前
|
JSON 前端开发 Java
SSM:SpringMVC
本文介绍了SpringMVC的依赖配置、请求参数处理、注解开发、JSON处理、拦截器、文件上传下载以及相关注意事项。首先,需要在`pom.xml`中添加必要的依赖,包括Servlet、JSTL、Spring Web MVC等。接着,在`web.xml`中配置DispatcherServlet,并设置Spring MVC的相关配置,如组件扫描、默认Servlet处理器等。然后,通过`@RequestMapping`等注解处理请求参数,使用`@ResponseBody`返回JSON数据。此外,还介绍了如何创建和配置拦截器、文件上传下载的功能,并强调了JSP文件的放置位置,避免404错误。
|
10月前
|
设计模式 前端开发 Java
了解 Spring MVC 架构、Dispatcher Servlet 和 JSP 文件的关键作用
Spring MVC 是 Spring 框架的一部分,是一个 Web 应用程序框架。它旨在使用 Model-View-Controller(MVC) 设计模式轻松构建Web应用程序。
146 0
|
5月前
|
存储 设计模式 前端开发
什么是SpringMVC?简单好理解!什么是应用分层?SpringMVC与应用分层的关系? 什么是三层架构?SpringMVC与三层架构的关系?
文章解释了SpringMVC的概念和各部分功能,探讨了应用分层的原因和具体实施的三层架构,以及SpringMVC与三层架构之间的关系和联系。
70 1
什么是SpringMVC?简单好理解!什么是应用分层?SpringMVC与应用分层的关系? 什么是三层架构?SpringMVC与三层架构的关系?