专栏首页用户1337634的专栏Java Bean Validation校验@PathVariable和@RequestParam

Java Bean Validation校验@PathVariable和@RequestParam

Java Bean Validation一般都用在Java Bean的校验上,其实也可以用来校验参数@PathVariable和@RequestParam

配置校验规则

//支持@PathVariable
//支持@RequestParam
@PutMapping("update/{uid:\\w+}")
public WebResult<Void> update(@Valid @Length(min = 2, max = 3, message = "uid should between 2 and 3") @PathVariable String uid,
                              @Valid @Length(min = 4, max = 5, message = "name should between 4 and 5") @RequestParam String name,
                              @Validated({UpdateGroup.class, Default.class}) @RequestBody Person person) {
    log.info("person to update: {}", person);
    return WebResult.SUCCESS;
}

添加@Validated

上面配置后,还是不能起作用,还需要在Controller上增加注解@Validated

@Slf4j
@SpringBootApplication
@RestController
@Validated
public class ValidationApplication {
    public static void main(String[] args) {
        SpringApplication.run(ValidationApplication.class, args);
    }

    @PutMapping("update/{uid:\\w+}")
    public WebResult<Void> update(@Valid @Length(min = 2, max = 3, message = "uid should between 2 and 3") @PathVariable String uid,
                                  @Valid @Length(min = 4, max = 5, message = "name should between 4 and 5") @RequestParam String name,
                                  @Validated({UpdateGroup.class, Default.class}) @RequestBody Person person) {
        log.info("person to update: {}", person);
        return WebResult.SUCCESS;
    }
}

自定义返回值

校验失败后抛出的异常是ConstraintViolationException,不是MethodArgumentNotValidException,所以也需要额外进行处理

@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MethodArgumentNotValidException.class)
public <T> WebResult<T> handleValidationExceptions(
        MethodArgumentNotValidException ex) {
    WebResult<T> result = new WebResult<>();
    result.setCode(400);
    String errorMsg = ex.getBindingResult().getAllErrors().stream()
            .map(DefaultMessageSourceResolvable::getDefaultMessage)
            .collect(Collectors.joining("\n", "[", "]"));
    result.setMsg(errorMsg);
    return result;
}

@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(ConstraintViolationException.class)
public <T> WebResult<T> handleConstraintViolationException(
        ConstraintViolationException ex) {
    WebResult<T> result = new WebResult<>();
    result.setCode(400);
    String errorMsg = ex.getConstraintViolations().stream()
            .map(ConstraintViolation::getMessage)
            .collect(Collectors.joining("\n", "[", "]"));

    result.setMsg(errorMsg);
    return result;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring使用Filter添加自定义header

    十毛
  • Spring Boot扩展机制 - Spring Factories

    十毛
  • 基于Eureka的远程调用 - Feign Client

    本文是在Eureka快速体验基础上构建的,但是如果eureka已经连接好,可以不用关注

    十毛
  • 泛型

    mathor
  • 再也不担心写出臃肿的Flink流处理程序啦,发现一款将Flink与Spring生态完美融合的脚手架工程-懒松鼠Flink-Boot

    还在为开发Flink流处理应用程序时无法像开发Spring Boot程序那么优雅的分层以及装配Bean而烦恼吗?

    intsmaze-刘洋
  • Struts Ajax Json

    Netkiller Java 手札 Java, Servlet, JavaBean ... 5.4. Ajax + JSON struts.xml 中加入 ...

    netkiller old
  • java enum(枚举)使用详解 + 总结

    enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中。

    哲洛不闹
  • Flink实战-定时器实现已完成订单自动五星好评

    在电商领域会有这么一个场景,如果用户买了商品,在订单完成之后,24小时之内没有做出评价,系统自动给与五星好评,我们今天主要使用flink的定时器来简单实现这一功...

    大数据技术与应用实战
  • 【SpringBoot 基础系列】实现一个自定义配置加载器(应用篇)

    Spring 中提供了@Value注解,用来绑定配置,可以实现从配置文件中,读取对应的配置并赋值给成员变量;某些时候,我们的配置可能并不是在配置文件中,如存在 ...

    一灰灰blog
  • Java重写compare方法实现数组降序排列

    链上世界

扫码关注云+社区

领取腾讯云代金券