请不要忽视优雅代码的力量,它会成倍提升你的编码效率、成倍降低后期维护成本,甚至成倍提升你的扩展性和成倍降低你写bug的可能性~ 回忆DataBinder/WebDataBinder 若对Spring...这个包,可见Spring它把数据绑定和数据校验牢牢的放在了一起,并且内部弱化了数据校验的概念以及逻辑(Spring想让调用者无需关心数据校验的细节,全由它来自动完成,减少使用的成本)。...(WebDataBinder binder, MethodParameter parameter) { // 拿到标注在此参数上的所有注解们(比如此处有@Valid和@RequestBody两个注解...个人直接建议使用@Validated即可,而去使用@Valid了,更不用自己给自己找麻烦去自定义注解啥的了~ 只有当Errors(BindingResult)入参是是仅跟着@Valid注解的实体,Spring...其实当Spring MVC在处理@RequestPart注解入参数据时,也会执行绑定、校验的相关逻辑。
函数参数 下列表格列出了controller方法可以接受的参数,稍后会对其进行详细的解释。...无需直接使用Servlet API来访问请求参数,请求属性和session的属性。...返回值 下列表格列出了支持的返回类型 返回值由HttpMessageConverters转换,直接写到响应体 类型转换 一些需要参数的注解,例如@RequestParam,@RequestHeader,...@ModelAttribute 使用@ModelAttribute修饰的函数参数可以访问Model中的属性,或者其未初始化是初始化。...WebDataBinder类通过匹配Servlet 的请求参数名(查询参数和form字段)来将字段名对应到对象中。当类型转换完之后填充匹配的字段。
它提供的能力是:把字符串形式的参数转换成服务端真正需要的类型的转换(当然可能还包含校验)。 对Spring中的数据绑定场景,小伙伴们就再熟悉不过了。...这也印证了那句名言嘛:我们的安好是因为有人替我们负重前行 查到网上的资料,大都停留在如何使用WebDataBinder的说明上,并且几乎没有文章是专门分析核心部件DataBinder的,本文作为此方面的一股清流...比如web包下大名鼎鼎的WebDataBinder~ 源码分析 DataBinder的源码相对来说还是颇为复杂的,它提供的能力非常强大,也注定了它的方法非常多、属性也非常多。...,默认是所有字段~~~ // 例如,在绑定HTTP请求参数时,限制这一点以避免恶意用户进行不必要的修改。...DataBinder是Spring提供,但其实把它发扬光大是发生在Web环境,也就是大名鼎鼎的WebDataBinder,毕竟我们知道一般只有进行web交互的时候,才会涉及到字符串 -> Java类型/
---- Spring验证器 Spring的输入验证甚至早于JSR 303(Java验证规范),尽管对于新的项目,一般建议使用JSR303验证器 为了创建Spring验证器,需要实现org.springframework.validation.Validator...大多数时候,只给reject或者rejectValue方法传入一个错误码,Spring就会在属性文件中查找错误码没回去相应的错误消息, 还可以传入一个默认的消息,当没有找到指定的错误码时,就会使用默认消息...Errors对象中的错误消息可以利用表单标签库的Errors标签显示在页面中, 错误消息可以通过Spring支持的国际化特性本地化。...或者利用@javax.validation.Valid对要验证的对象参数进行标注 public String saveProduct(@Valid @ModelAttribute Product product...,BindingResult bindingResult,Model model){ } Valid是JSR303中定义的,下篇博文将介绍。
对于RequestMappingHandlerAdapter来说,它的主要职责有以几个: 解析控制器方法的参数列表,并从request请求对象中获取到相关参数值,并保存起来 (这个过程还涉及到参数类型转换问题...,需要求助Spirng提供的类型转换模块支持) 反射执行控制器方法,将先前准备好的参数值列表传入 控制器方法执行完毕后,处理返回结果,并将返回结果统一转换为ModelAndView,供SpringMVC...后续视图渲染组件使用 ---- 方法参数解析器 对于控制器方法参数解析而言,由于Spring支持多种注解形式来提示从哪里获取参数值,参数key是什么等等,因此如果使用一个参数解析器完成所有注解的解析...,并且设置对省略注解情况的参数解析,同时必须放在参数解析器列表的末尾。...参数解析器列表挑选的原理是找到第一个能够support支持处理当前参数的,然后直接返回该参数处理器进行解析处理。
我们现在把注意力放在applyPropertyValues这个方法,方法名直译过来的意思是--------应用属性值,就是将方法参数中的属性值应用到Bean上,也就是进行属性绑定。...getPropertyAccessor(),获取一个属性访问器,关于属性访问器在《Spring官网阅读十四》也有介绍,这里我再做一些补充 ?...()访问的是哪种类型的属性访问器呢?...Servlet API,会从ServletRequest中解析出参数,然后绑定到对应的Bean上,同时还能将文件对象绑定到Bean上。...// 我们在使用@PathVariable的时候,解析出来的参数就放在request中的这个属性上,然后由ExtendedServletRequestDataBinder完成数据绑定
先直接上结论吧,数据解析的过程太长了 从参数解析器组里拿到自定义参数的解析器ServletModelAttributeMethodProcessor(循环遍历参数解析器组,找到能支持的) 然后通过反射创建出一个空的参数对象...(这里就是Person) 创建数据绑定器,数据绑定器里面封装了刚刚创建的对象Person,还有参数的名称person,以及请求(WebDataBinder binder = binderFactory.createBinder...extends WebDataBinder { public void bind(WebRequest request) { // 这里就能拿到 请求参数中的key-value...PrivilegedActionException ex) { throw ex.getException(); } } else { // 设置方法为可访问的...name=李四&age=18&pet=黑皇,3"时,spring试图将字符串"黑皇,3"转为Pet对象,默认的转换器里面没有一个将字符串转为pet对象的,所以就会报错 2024-03-10 11:40:
这是最可取的,因为它很简单:无需在配置文件中为控制器声明bean。注意:通过使用@Controller 注解,可以拥有一个多动作控制器类,该类能够处理多个不同的请求。...6、将请求参数映射到处理程序方法Spring MVC的很酷的功能之一是,可以使用@RequestParam 注解将请求参数作为处理程序方法的常规参数进行检索。...例如:@RequestParam(defaultValue = "18") int ageMap 如果方法参数是type,Spring还允许将所有参数作为对象 访问 Map的参数 。Spring使用此映射存储模型的对象。...通过Spring的灵活性,只需在处理方法中添加相关参数即可。
,并最终生成数据绑定结果 BindingData 对象 SpringMVC 抽取 BindingResult 中的入参对象和校验错误对象,将他们赋给处理方法的响应入参 **@InitBinder 注解...** 由 @InitBinder 标识的方法,可以对 WebDataBinder 对象进行初化。...WebDataBinder 是 DataBinder 的子类,用于完成由表单字段 JavaBean 属性的绑定 @InitBinder方法不能有返回值,它必须声明为 void @InitBinder方法的参数通常是...WebDataBinder,它可以对 DataBinder 进行初始化和一些设置,如设置绑定过程中使得某些字段不被赋值 数据格式化 Spring 在格式化模块中定义了一个实现 ConversionService...需要,通常情况下,将类似于数据源,事务,整合其他框架都是放在 Spring 的配置文件中,而不是 SpringMVC 文件中,实际上放入 Spring 配置文件对应的 IOC 容器中的还有 Service
调试准备 搭建一个基本的Spring web项目即可 Controller部分 @Controller public class IndexController { @RequestMapping...源码非常庞大,不能只见树木不见森林,需要有针对性的阅读,所以本篇只需要关注主体流程即可。...,提供对方法参数,方法返回值,方法注释等的便捷访问。 ...Spring系列的学习笔记和面试题,包含spring面试题、spring cloud面试题、spring boot面试题、spring教程笔记、spring boot教程笔记、最新阿里巴巴开发手册(63...关注公众号:程序员白楠楠,即可获取这份1184页PDF文档的spring全家桶资料。
Spring Validation是对hibernate validation的二次封装,用于支持spring mvc参数自动校验。...接下来,我们以spring-boot项目为例,介绍Spring Validation的使用。...DTO表示数据传输对象(Data Transfer Object),用于服务器和客户端之间交互传输使用的。在spring-web项目中可以表示用于接收请求参数的Bean对象。...在spring-mvc中,RequestResponseBodyMethodProcessor是用于解析@RequestBody标注的参数以及处理@ResponseBody标注方法的返回值的。...MethodInterceptor { @Override public Object invoke(MethodInvocation invocation) throws Throwable { //无需增强的方法
这是最可取的,因为它很简单:无需在配置文件中为控制器声明bean。 注意:通过使用@Controller 注解,您可以拥有一个多动作控制器类,该类能够处理多个不同的请求。...6.将请求参数映射到处理程序方法 Spring MVC的很酷的功能之一是,您可以使用@RequestParam 注解将请求参数作为处理程序方法的常规参数进行检索。...例如: @RequestParam(defaultValue = "18") int age Map 如果方法参数是type,Spring还允许我们将所有参数作为对象 访问 Map的参数 。Spring使用此映射存储模型的对象。...通过Spring的灵活性,只需在处理方法中添加相关参数即可。
这是最可取的,因为它很简单:无需在配置文件中为控制器声明bean。 注意:通过使用@Controller 注解,您可以拥有一个多动作控制器类,该类能够处理多个不同的请求。...06 将请求参数映射到处理程序方法 Spring MVC的很酷的功能之一是,您可以使用@RequestParam 注解将请求参数作为处理程序方法的常规参数进行检索。...例如: @RequestParam(defaultValue = "18") int age Map 如果方法参数是type,Spring还允许我们将所有参数作为对象 访问 Map的参数 。Spring使用此映射存储模型的对象。...通过Spring的灵活性,只需在处理方法中添加相关参数即可。
Spring Validation是对hibernate validation的二次封装,用于支持spring mvc参数自动校验。...接下来,我们以spring-boot项目为例,介绍Spring Validation的使用。...DTO表示数据传输对象(Data Transfer Object),用于服务器和客户端之间交互传输使用的。在spring-web项目中可以表示用于接收请求参数的Bean对象。...在spring-mvc中,RequestResponseBodyMethodProcessor是用于解析@RequestBody标注的参数以及处理@ResponseBody标注方法的返回值的。...{ @Override public Object invoke(MethodInvocation invocation) throws Throwable { //无需增强的方法
Spring 自家的 Validator API 设计的比较简陋,而且需要开发人员编写数量繁多的 Validator 实现类,这与 Jakarta Bean Validation 所推崇的注解式约束 (...尽管在 Spring MVC 中依然可以看到 Spring Validator API 的身影,其实最终也是将校验请求转发到 Jakarta Bean Validation 中去的,这部分内容会是本文的重点...具备分组校验的能力,其 validate() 方法中第三个参数Object... validationHints就是和分组校验相关的,而 NoOpValidator 是一个空的实现。...HandlerMethod所需要的方法参数值 (有了参数才能反射调用由@RestController注解标记的方法),然后进行 Bean Validation 操作。...RequestResponseBodyMethodProcessor是极为重要的一个 HandlerMethodArgumentResolver 实现类,因为由@RequestBody标记的参数就由它解析
本篇使用的Spring版本为5.2.2.RELEASE 九大组件 SpringMVC几乎所有的功能都由九大组件来完成,所以明白九大组件的作用,对于学习SpringMVC来说非常重要。...调试准备 搭建一个基本的Spring web项目即可 Controller部分 @Controller public class IndexController { @RequestMapping...源码非常庞大,不能只见树木不见森林,需要有针对性的阅读,所以本篇只需要关注主体流程即可。...,提供对方法参数,方法返回值,方法注释等的便捷访问。...:处理@RequestBody注解类型的参数 有兴趣的同学可以试试更多不同形式的参数。
因为发生上述问题的根源所在是集合中 StringHttpMessageConverter 的顺序先于 MappingJackson2HttpMessageConverter 的,调整顺序后即可从根源上解决这个问题...Java API 的规范 JSR303 定义了校验的标准 validation-api ,其中一个比较出名的实现是 hibernate validation ,spring validation 是对其的二次封装...,常用于 SpringMVC 的参数自动校验,参数校验的代码就不需要再与业务逻辑代码进行耦合了 @PathVariable 和 @RequestParam 参数校验 Get 请求的参数接收一般依赖这两个注解...参数校验 Post、Put 请求的参数推荐使用 @RequestBody 请求体参数 对 @RequestBody 参数进行校验需要在 DTO 对象中加入校验条件后,再搭配 @Validated 即可完成自动校验...,注解加到了参数上面,可以比较容易猜测到是使用了 AOP 对方法进行增强 而实际上 Spring 也是通过 MethodValidationPostProcessor 动态注册 AOP 切面,然后使用
确定将要执行的目标方法的每一个参数的值是什么; SpringMVC目标方法能写多少种参数类型。...调用各自 HandlerMethodArgumentResolver 的 resolveArgument 方法即可 5.3、自定义类型参数 封装POJO ServletModelAttributeMethodProcessor...binder = binderFactory.createBinder(webRequest, attribute, name); WebDataBinder :web数据绑定器,将请求参数的值绑定到指定的...JavaBean里面 WebDataBinder 利用它里面的 Converters 将请求数据转成指定的数据类型。...(statusCode, resolvedReason);tomcat发送的/error Spring底层的异常,如 参数类型转换异常;DefaultHandlerExceptionResolver
Controller 代码会有几个问题: 参数校验过多地耦合了业务代码,违背单一职责原则 可能在多个业务中都抛出同一个异常,导致代码重复 各种异常反馈和成功响应格式不统一,接口对接不友好 基于 Spring...spring validation 是对其的二次封装,常用于 SpringMVC 的参数自动校验,参数校验的代码就不需要再与业务逻辑代码进行耦合了。...参数校验 Post、Put 请求的参数推荐使用 @RequestBody 请求体参数。...对 @RequestBody 参数进行校验需要在 DTO 对象中加入校验条件后,再搭配 @Validated 即可完成自动校验。... { @Override public Object invoke(MethodInvocation invocation) throws Throwable { //无需增强的方法