龙空技术网

如何在Springboot中完成参数校验

勇往直前的努力E8QY 284

前言:

今天朋友们对“java数组非空校验”大致比较关切,朋友们都想要分析一些“java数组非空校验”的相关内容。那么小编在网摘上汇集了一些对于“java数组非空校验””的相关内容,希望兄弟们能喜欢,兄弟们一起来学习一下吧!

在开发Web应用程序时,参数校验是不可避免的一个过程。在Springboot中,使用参数校验可以使你的代码更加简洁有效,增强客户体验。本文将为大家介绍Springboot中参数校验的实现方法。

一、Spring的校验框架

Spring的校验框架支持两种校验方式:基于注解和自定义校验器。

基于注解

在Spring框架中,可以使用JSR 303和JSR 349注解来进行参数校验,其中最常用的注解有:

1. @NotNull  被注释的元素必须不为 null2. @Size(min=, max=)  被注释的字符串的大小必须在指定范围内3. @Min(value=)  被注释的元素必须是一个数字,它的值必须大于或等于指定的最小值4. @Max(value=)  被注释的元素必须是一个数字,它的值必须小于或等于指定的最大值5. @Pattern(value=)  被注释的元素必须符合指定的正则表达式6. @NotBlank(message =)  被注释的字符串必须非空7. @NotEmpty  被注释的字符串必须非空,和@NotBlank类似,但不能处理全部是空格的情况@NotNull,@NotBlank,@NotEmpty 三者区别//@NotNull:它的作用是标记此参数不允许为null,即不能为空,但可以是空字符串或空集合。它适用于任何类型的参数。//@NotBlank:它的作用是标记此参数不允许为null或空字符串,但可以是空格字符串或空集合。只适用于字符串类型。//@NotEmpty:它的作用是标记此参数不允许为null或空集合,但可以是空字符串或只含空格的字符串。适用于集合类型和字符串类型。//当参数不符合注解标记的要求时,校验框架会抛出相应的异常进行提示。因此,我们在使用这些注解时,要根据具体情况选择使用哪种注解
代码样例:public class User {    // 校验用户名非空且长度大于0    @NotBlank(message = "用户名不能为空")    private String username;    // 校验密码非空    @NotEmpty(message = "密码不能为空")    private String password;    // 校验年龄不为null且大于0    @NotNull(message = "年龄不能为空")    @Min(value = 1, message = "年龄必须大于0")    private Integer age;    // 校验地址集合非空且元素数量大于0    @NotEmpty(message = "地址不能为空")    private List<String> addresses;    // 校验电话号码数组非空且元素数量大于0    @NotEmpty(message = "电话号码不能为空")    private String[] phoneNumbers;}

2.自定义注解

如果内置的验证注解不能满足要求,可以通过实现ConstraintValidator接口来编写自己的验证逻辑。下面以验证手机号码为例,代码如下所示:

@Target({ElementType.METHOD, ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@Documented@Constraint(validatedBy = PhoneValidator.class)public @interface Phone {    String message() default "Invalid phone number";    Class<?>[] groups() default {};    Class<? extends Payload>[] payload() default {};}

自定义校验器:

public class PhoneValidator implements ConstraintValidator<Phone,String> {    @Override    public void initialize(Phone constraintAnnotation) {    }    @Override    public boolean isValid(String value, ConstraintValidatorContext context) {        Pattern pattern = Pattern.compile("^1[3|4|5|7|8][0-9]\\d{8}$");        if (value == null || "".equals(value)) {            return true;        }        Matcher matcher = pattern.matcher(value);        return matcher.matches();    }}
二、Springboot中的使用配置

首先需要在pom.xml中引入以下依赖:

<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-validation</artifactId></dependency>

然后在需要进行参数校验的接口中,添加注解@Validated。这一步非常重要,因为Springboot默认是不启用参数校验的。

Controller

在Controller中,可以使用@RequestBody或@RequestParam注解来接收请求参数。同时,要在参数前加上验证注解。例如:

@RestController@RequestMapping("/demo")@Validatedpublic class DemoController {    @PostMapping("/phoneCheck")    public String phoneCheck(@RequestParam("phone") @Phone String phone) {        return "success";    }}

在以上代码中,我们使用了自定义校验器@Phone来验证手机号码输入是否合法。

处理校验结果

当参数校验失败时,Springboot会自动抛出异常,如何将校验结果返回给前端呢?

可以在接口中添加BindingResult对象来处理校验结果。例如:

@PostMapping("/phoneCheck")public Object phoneCheck(@RequestParam("phone") @Phone String phone, BindingResult bindingResult) {    if (bindingResult.hasErrors()) {//        StringBuilder stringBuilder = new StringBuilder();//        for (ObjectError error : bindingResult.getAllErrors()) {//            stringBuilder.append(error.getDefaultMessage()).append("\n");Map<String, String> errors = new HashMap<>();result.getFieldErrors().forEach(error -> errors.put(error.getField(), error.getDefaultMessage()));return ResponseEntity.badRequest().body(errors);                } //       return stringBuilder.toString(); return  ResponseEntity.ok().build();       }    return null;}

以上代码中,我们首先判断BindingResult对象是否存在错误。如果存在,则遍历所有错误信息,并返回给前端。如果没有错误,则进行正常业务处理。

三、小结

参数校验是Web应用程序开发中的重要环节。在Springboot中,使用JSR 303和JSR 349注解以及自定义校验器来实现参数校验非常方便。同时,通过BindingResult对象可以方便地处理校验结果,提升用户体验。

标签: #java数组非空校验