首页
学习
活动
专区
圈层
工具
发布

@Validated和@Valid的区别?教你使用它完成Controller参数校验(含级联属性校验)以及原理分析【享学Spring】

请不要忽视优雅代码的力量,它会成倍提升你的编码效率、成倍降低后期维护成本,甚至成倍提升你的扩展性和成倍降低你写bug的可能性~ 回忆DataBinder/WebDataBinder 若对Spring...这个包,可见Spring它把数据绑定和数据校验牢牢的放在了一起,并且内部弱化了数据校验的概念以及逻辑(Spring想让调用者无需关心数据校验的细节,全由它来自动完成,减少使用的成本)。...(WebDataBinder binder, MethodParameter parameter) { // 拿到标注在此参数上的所有注解们(比如此处有@Valid和@RequestBody两个注解...个人直接建议使用@Validated即可,而去使用@Valid了,更不用自己给自己找麻烦去自定义注解啥的了~ 只有当Errors(BindingResult)入参是是仅跟着@Valid注解的实体,Spring...其实当Spring MVC在处理@RequestPart注解入参数据时,也会执行绑定、校验的相关逻辑。

3.8K42
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    聊聊Spring中的数据绑定 --- DataBinder本尊(源码分析)【享学Spring】

    它提供的能力是:把字符串形式的参数转换成服务端真正需要的类型的转换(当然可能还包含校验)。 对Spring中的数据绑定场景,小伙伴们就再熟悉不过了。...这也印证了那句名言嘛:我们的安好是因为有人替我们负重前行 查到网上的资料,大都停留在如何使用WebDataBinder的说明上,并且几乎没有文章是专门分析核心部件DataBinder的,本文作为此方面的一股清流...比如web包下大名鼎鼎的WebDataBinder~ 源码分析 DataBinder的源码相对来说还是颇为复杂的,它提供的能力非常强大,也注定了它的方法非常多、属性也非常多。...,默认是所有字段~~~ // 例如,在绑定HTTP请求参数时,限制这一点以避免恶意用户进行不必要的修改。...DataBinder是Spring提供,但其实把它发扬光大是发生在Web环境,也就是大名鼎鼎的WebDataBinder,毕竟我们知道一般只有进行web交互的时候,才会涉及到字符串 -> Java类型/

    95630

    Spring MVC-07循序渐进之验证器 上 (Spring自带的验证框架)

    ---- 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中定义的,下篇博文将介绍。

    77720

    Spring MVC注解Controller源码流程解析--HandlerAdapter执行流程--上

    对于RequestMappingHandlerAdapter来说,它的主要职责有以几个: 解析控制器方法的参数列表,并从request请求对象中获取到相关参数值,并保存起来 (这个过程还涉及到参数类型转换问题...,需要求助Spirng提供的类型转换模块支持) 反射执行控制器方法,将先前准备好的参数值列表传入 控制器方法执行完毕后,处理返回结果,并将返回结果统一转换为ModelAndView,供SpringMVC...后续视图渲染组件使用 ---- 方法参数解析器 对于控制器方法参数解析而言,由于Spring支持多种注解形式来提示从哪里获取参数值,参数key是什么等等,因此如果使用一个参数解析器完成所有注解的解析...,并且设置对省略注解情况的参数解析,同时必须放在参数解析器列表的末尾。...参数解析器列表挑选的原理是找到第一个能够support支持处理当前参数的,然后直接返回该参数处理器进行解析处理。

    93930

    springboot源码解析之自定义参数解析

    先直接上结论吧,数据解析的过程太长了 从参数解析器组里拿到自定义参数的解析器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:

    18010

    SpringMVC(二)

    ,并最终生成数据绑定结果 BindingData 对象 SpringMVC 抽取 BindingResult 中的入参对象和校验错误对象,将他们赋给处理方法的响应入参 **@InitBinder 注解...** 由 @InitBinder 标识的方法,可以对 WebDataBinder 对象进行初化。...WebDataBinder 是 DataBinder 的子类,用于完成由表单字段 JavaBean 属性的绑定 @InitBinder方法不能有返回值,它必须声明为 void @InitBinder方法的参数通常是...WebDataBinder,它可以对 DataBinder 进行初始化和一些设置,如设置绑定过程中使得某些字段不被赋值 数据格式化 Spring 在格式化模块中定义了一个实现 ConversionService...需要,通常情况下,将类似于数据源,事务,整合其他框架都是放在 Spring 的配置文件中,而不是 SpringMVC 文件中,实际上放入 Spring 配置文件对应的 IOC 容器中的还有 Service

    88830

    Spring:全面拥抱 Jakarta Bean Validation 规范

    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标记的参数就由它解析

    2.8K30

    Controller层代码这么写,简洁又优雅!

    因为发生上述问题的根源所在是集合中 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 切面,然后使用

    7910

    Controller层代码这么写,简洁又优雅!

    Controller 代码会有几个问题: 参数校验过多地耦合了业务代码,违背单一职责原则 可能在多个业务中都抛出同一个异常,导致代码重复 各种异常反馈和成功响应格式不统一,接口对接不友好 基于 Spring...spring validation 是对其的二次封装,常用于 SpringMVC 的参数自动校验,参数校验的代码就不需要再与业务逻辑代码进行耦合了。...参数校验 Post、Put 请求的参数推荐使用 @RequestBody 请求体参数。...对 @RequestBody 参数进行校验需要在 DTO 对象中加入校验条件后,再搭配 @Validated 即可完成自动校验。... {     @Override     public Object invoke(MethodInvocation invocation) throws Throwable {         //无需增强的方法

    44820
    领券