`
码王信息
  • 浏览: 5383 次
文章分类
社区版块
存档分类
最新评论

使用validator-api来验证spring-boot的参数

阅读更多
作为服务端开发,验证前端传入的参数的合法性是一个必不可少的步骤,但是验证参数是一个基本上是一个体力活,而且冗余代码繁多,也影响代码的可阅读性,所以有没有一个比较优雅的方式来解决这个问题?

这么简单的问题当然早就有大神遇到并且解决了,这一篇文章主要讲一下解决基于spring-boot的验证参数的比较好的方法:利用validator-api来进行验证参数。

在spring-boot-starter-web包里面有hibernate-validator包,它提供了一系列验证各种参数的方法,所以说spring-boot已经帮我们想好要怎么解决这个问题了。

这篇文章针对spring-boot里面的spring-mvc介绍三种方式来验证参数。

(一):这个方法在网上大部分都可以查到,先假设我们的restful的接口接受一个GradeAndClassroomModel类型的对象,并且这个类被定义成

@Data
public class GradeAndClassroomModel { 
@Range(min = 1, max = 9, message = "年级只能从1-9") 
private int grade; 
@Range(min = 1, max = 99, message = "班级只能从1-99") 
private int classroomNumber;
}
利用validator提供的一系列注解,比如本例中的@Range,就可以表示参数的范围和出错时候的提示信息。还有很多其他注解,这里就不一一列出

然后我们的Controller层的代码为

@RequestMapping(value = "/paramErrorTest", method = RequestMethod.GET)
public String paramErrorTest(   
  @Valid   
  @ModelAttribute   
  GradeAndClassroomModel gradeAndClassroomModel,
  BindingResult result) { 
  return classroomService.getTeacherName(gradeAndClassroomModel.getGrade(), gradeAndClassroomModel.getClassroomNumber());
}
其中如果验证出错,result对象里面就会有错误信息,然后可以自己进行处理。

(二): 针对上面的例子,会有人说,就两个参数,为什么要作为对象呢?会不会太麻烦?确实,如果只有少数对象,直接把参数写到Controller层,然后在Controller层进行验证就可以了。

@RequestMapping(value = "/teacherName", method = RequestMethod.GET)
public String teacherName(
  @Range(min = 1, max = 9, message = "年级只能从1-9")       
  @RequestParam(name = "grade", required = true)
  int grade, 
  @Min(value = 1, message = "班级最小只能1")   
  @Max(value = 99, message = "班级最大只能99")     
  @RequestParam(name = "classroom", required = true)   
  int classroom) { 
return classroomService.getTeacherName(grade, classroom);
}
如果直接把validator提供的注解移除来写到请求参数上面的话是不是就可以了呢?答案是错,为什么这样不能成功的验证参数呢?具体原因大家可以参考官方文档:http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/htmlsingle/#validation-beanvalidation-spring-method

上面的文档已经说的很清楚了,所以我们需要创建一个Bean

@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() { 
  return new MethodValidationPostProcessor();
}
然后在类方法上面加上注解@Validated

@RestController
@RequestMapping("/spring-boot/classroom")
@Validated
public class ClassroomController {
...
}
然后之前没有生效的注解@Range、@Min、@Max等validator包里面提供的注解就可以生效了。

(三)估计到了这里又会有人问,如果validator包里面注解不能满足我们的需求,我们是否可以自己定义参数验证的逻辑。答案是肯定的,我们可以利用

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER, ElementType.FIELD})
@Constraint(validatedBy = {Validator.class})
public @interface ParamValidator {

  String message() default "Parameter error!";

  Class<?>[] groups() default {};

  Class<? extends Payload>[] payload() default {};

}


public class Validator implements ConstraintValidator<ParamValidator, Object> {
  ...
}
组合进行自定义,具体的例子网上其他文章就很多了,这里就不进行详细的例子了,但是最终使用的时候就是

  @RequestMapping(value = "/paramValidator", method = RequestMethod.GET)
  public String paramValidator(
      @ParamValidator(isRequired = true, desc = "年级", range = "int:1~9", message = "年级只能从1-9")
      @RequestParam(name = "grade", required = true)
      int grade,
      @ParamValidator(isRequired = true, desc = "班级", range = "int:1~99", message = "班级只能从1-99")
      @RequestParam(name = "classroom", required = true)
      int classroom) {
    return classroomService.getTeacherName(grade, classroom);
  }
另外不要忘记方法二里面里面提到的MethodValidationPostProcessor这个bean,如果没有初始化这个bean,自定义的验证方法也不会执行。验证逻辑会失效。

是不是通过这样写注解的方式来验证进行请求的参数,代码逻辑更佳清晰和优雅?表达的含义也会更佳清楚?并且没有了大量重复的类似的验证代码。

Ps:这里的代码都是基于spring-mvc框架来试验的,如果有人并没有使用spring-mvc作为rest框架,而是使用jersey来作为rest框架的话,可能一些细节方面需要调整, 但是这三种方案应该都是可以兼容的。

最后如果觉得所讲的东西能够帮助到你,并且希望了解更多的知识,进行更详细的深入的学习,欢迎加群632109190进行讨论和学习。
分享到:
评论

相关推荐

    spring-boot-starter-validation-1.3.5.RELEASE.zip

    标题中的"spring-boot-starter-validation-1.3.5.RELEASE.zip"是一个Spring Boot的启动模块,专注于数据验证功能的版本。Spring Boot是Java生态系统中一个流行的微服务框架,它简化了创建独立、生产级别的Spring应用...

    hibernate-validator-5.2.4

    Hibernate Validator是Java世界中一个非常重要的验证框架,它是JSR 303(Bean Validation)和JSR 349(Bean Validation 1.1)规范...同时,配合使用相关的工具和框架,如Spring Boot,可以使验证过程更加便捷和自动化。

    hibernate-validator-demo

    这里会使用`@Valid`注解来触发验证,如果验证失败,Spring会自动将错误信息放入模型视图中供前端展示。 6. **错误处理**:项目可能会包含一个错误处理器,用于优雅地处理验证失败的情况,如返回友好的错误信息,而...

    json-schema-validation:使用JSON模式进行API有效负载验证

    java -jar target/spring-boot-restful-api-1.0-SNAPSHOT.jar 将浏览器指向 curl -X POST -d '{ "customerid": "1234567", "password": "password12" , "first": "Subhasis","last": "samal", "gender": "Male", ...

    spring-boot-user-account-registration:使用Spring Boot注册用户帐户

    综上所述,"spring-boot-user-account-registration"项目涵盖了Spring Boot核心特性、用户账户管理、前端UI设计、数据库集成、数据验证、安全性和测试等多个方面。这为构建一个完整的用户注册系统提供了全面的实践...

    集成spring-boot-starter-validation对接口参数校验.zip

    总的来说,通过集成`spring-boot-starter-validation`,我们可以轻松地在Spring Boot应用中进行接口参数的校验,确保数据的正确性和一致性,提高了系统的稳定性和用户体验。同时,该框架也提供了丰富的扩展性,支持...

    spring-web.jar spring-webmvc.jar

    7. **验证**:使用`Validator`接口进行数据验证,确保输入数据的有效性。 8. **异常处理**:通过`@ExceptionHandler`注解或配置文件,可以全局地处理应用程序可能出现的异常。 这两个库共同构建了Spring MVC框架的...

    springmvc4与hibernate validation校验器完全兼容jar包

    当需要验证这些参数时,Spring MVC提供了注解驱动的验证机制,允许开发者通过在字段或方法上添加验证注解来定义验证规则。 例如,我们可以使用`@NotNull`、`@Size`等注解来声明字段的非空和长度限制: ```java ...

    springbootjar

    - `spring-boot-autoconfigure-1.2.5.RELEASE.jar`:Spring Boot的自动配置模块,根据类路径中的依赖自动配置应用。 - `logback-core-1.1.3.jar`:Logback日志框架的核心库,Spring Boot默认的日志解决方案。 这些...

    spring-boot笔记

    ### Spring Boot 笔记 #### 一、Spring Boot 项目配置与依赖管理 Spring Boot 是一个简化 Spring 应用程序开发的框架,它利用“约定优于配置”的理念,简化了 Spring 的配置工作。以下是关于 Spring Boot 项目的...

    springboot 2.3之后消失的hibernate-validator解决方法

    在之前的版本中,`spring-boot-starter-web`依赖包默认包含了`hibernate-validator`,但自2.3版本起,这个依赖被移除,使得在项目升级后可能会遇到验证功能失效的问题。本文将详细介绍如何解决这个问题。 首先,...

    Javaee开发 spring boot实战

    3. 快速起步:提供“spring-boot-starter”起步依赖,只需添加对应模块,即可引入所需功能。 三、Spring Boot的主要特性 1. 零配置:基于约定优于配置的原则,Spring Boot默认配置了很多常见功能,减少了XML配置。 ...

    Hibernate Validator校验框架Demo

    4. **控制器处理**:在控制器方法中,使用`@Valid`注解标记需要验证的参数,Spring会自动调用Hibernate Validator进行验证。 ```java @RequestMapping(method = RequestMethod.POST) public String register(@Valid...

    validator验证

    以下是一个简单的Java Spring Boot中使用`Hibernate Validator`的例子: ```java public class User { @NotNull(message = "用户名不能为空") private String username; @Email(message = "邮箱格式不正确") ...

    springboot-restful-passwordvalidator:密码验证器Restful API使用Springboot

    要构建:mvn clean package要运行:mvnw spring-boot:run或java -jar target / password-validator-0.0.1-SNAPSHOT.jar 服务器端口:9000管理服务器端口:9001管理服务器地址:127.0.0.1 API详细信息:URL: 方法...

    [SpringBoot系列]验证客户端参数接口

    这个"[SpringBoot系列]验证客户端参数接口"实例将深入讲解如何在Spring Boot应用中实现参数验证功能。我们将探讨以下几个关键知识点: 1. **Bean Validation** Bean Validation是Java EE的一部分,它定义了一个...

    springmvc、hibernate、spring整合所需要所有jar包

    此外,对于现代项目,可能还需要考虑使用Spring Boot,它自动配置了许多默认设置,简化了项目搭建和配置过程。 总的来说,Spring MVC、Hibernate和Spring的整合涉及到了Web应用的各个层面,包括前端请求处理、业务...

    最全最经典spring-mvc教程

    除此之外,教程可能还会涵盖Spring MVC的RESTful API设计,如何创建JSON响应,以及使用Spring Boot快速构建Spring MVC应用。Spring Boot简化了配置,提供了预配置的依赖,使得开发者能更快地启动项目。 错误处理和...

    Spring Boot Web 开发注解篇

    它引入了一系列子依赖,如`spring-boot-starter`、`spring-boot-starter-json`、`spring-boot-starter-tomcat`、`hibernate-validator`、`spring-web`和`spring-webmvc`。 `spring-boot-starter`提供了自动配置支持...

    [咕泡学院] Spring Boot 系列课程大纲1

    还将探讨如何使用Spring Boot构建REST服务,包括HATEOAS(超媒体作为应用状态的引擎)的应用和API文档的生成。同时,课程还会涵盖不同类型的REST客户端,如浏览器、Apache HttpClient和Spring RestTemplate的使用。 ...

Global site tag (gtag.js) - Google Analytics