首页 > 文章列表 > springboot参数格式怎么校验

springboot参数格式怎么校验

springboot
316 2023-05-19

springboot参数格式怎么校验

springboot 参数格式校验

@Validated

字面意思校验

@RequestBody

该注解不用多说,意思是接收为json格式的参数

@Validated

字面意思校验, 需要配合@NotBlank 或者 @NotNull 注解才能生效

进入到请求体参数中。

springboot 参数注解校验

1.添加依赖

<dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-validation</artifactId>

        </dependency>
package com.xl.annotation;

import lombok.Data;

import org.hibernate.validator.constraints.Length;

import org.hibernate.validator.constraints.Range;

import javax.validation.constraints.*;

import java.math.BigDecimal;

import java.util.Date;

@Data

public class User {



        @NotNull(message = "ID不能为空")

        @Range(min = 1, max = 100, message = "ID必须在1到100之间")

        private Integer id;



        @NotNull(message = "姓名不能为空")

        @Length(min = 2, max = 6, message = "姓名必须在2到6位之间")

        private String name;



        @NotNull(message = "余额不能为空")

        @DecimalMax(value = "30.50", message = "余额不能超过30.5")

        @DecimalMin(value = "1.50", message = "余额不能低于1.5")

        private BigDecimal amount;



        @NotNull(message = "生日不能为空")

        @Past(message = "生日必须是过去")

        private Date birthday;



        @NotBlank(message = "邮箱不能为空")

        @Email(message = "邮箱格式不正确")

        private String email;



        @NotBlank(message = "手机号不能为空")

        @Pattern(regexp = "^(((13[0-9])|(14[579])|(15([0-3]|[5-9]))|(16[6])|(17[0135678])|(18[0-9])|(19[89]))d{8})$", message = "手机号格式错误")

        private String phone;

}

2.controller层

package com.xl.annotation;

import io.swagger.annotations.Api;

import io.swagger.annotations.ApiOperation;

import io.swagger.annotations.ApiParam;

import org.springframework.validation.BindingResult;

import org.springframework.validation.ObjectError;

import org.springframework.validation.annotation.Validated;

import org.springframework.web.bind.annotation.*;

import javax.validation.ValidationException;

import javax.validation.constraints.Max;

import javax.validation.constraints.NotNull;



@RestController

@Validated

@Api(value = "手机验证",description = "手机验证")

public class MobileController {

@ApiOperation("手机验证")

@RequestMapping("/phone")

    public String mobilePattern( Phone phone){

        return "chengg";

    }

    @PostMapping("/getUser")

    @ApiOperation("手机验证12")

    public String getUserStr( @NotNull(message = "name 不能为空")@RequestParam String name,

                              @Max(value = 99, message = "不能大于99岁")@RequestParam Integer age) {

        return "name: " + name + " ,age:" + age;

    }

   /* @PostMapping("/getUser1")

    @ApiOperation("手机验证c")

    public String getUser(@RequestBody @Validated User user, BindingResult bindingResult) {

        validData(bindingResult);

        return "name: " + user.getName() + " ,age:" + user.getAge();

    }*/

    private void validData(BindingResult bindingResult) {

        if (bindingResult.hasErrors()) {

            StringBuffer sb = new StringBuffer();

            for (ObjectError error : bindingResult.getAllErrors()) {

                sb.append(error.getDefaultMessage());

            }

            throw new ValidationException(sb.toString());

        }

    }



    @PostMapping("/test")

    @ApiOperation(value = "测试", notes = "")

    public String  test(@ApiParam(name = "test", value = "参数", required = true) @Validated @RequestBody User test, BindingResult bindingResult) {

        validData(bindingResult);

        if(bindingResult.hasErrors()){

            String errorMsg = bindingResult.getFieldError().getDefaultMessage();

            return errorMsg;

        }

        return "参数验证通过";

    }

}

3.自定义一个抛出异常类

package com.xl.annotation;

import org.springframework.http.HttpStatus;

import org.springframework.web.bind.annotation.ExceptionHandler;

import org.springframework.web.bind.annotation.ResponseStatus;

import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.validation.ConstraintViolation;

import javax.validation.ConstraintViolationException;

import javax.validation.ValidationException;

import java.util.Set;



/**

 * 自定义验证抛出异常

 */

@RestControllerAdvice

public class GlobalExceptionHandler {

    @ExceptionHandler(ValidationException.class)

    @ResponseStatus(HttpStatus.BAD_REQUEST)

    public String handle(ValidationException exception) {

        if(exception instanceof ConstraintViolationException){

            ConstraintViolationException exs = (ConstraintViolationException) exception;



            Set<ConstraintViolation<?>> violations = exs.getConstraintViolations();

            for (ConstraintViolation<?> item : violations) {

                //打印验证不通过的信息

                System.out.println(item.getMessage());

            }

        }

        return exception.getMessage();

    }

}

4.加一个当检测第一个参数不合法时立即返回错误不会继续进行校验

package com.xl.annotation;

import org.hibernate.validator.HibernateValidator;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import javax.validation.Validation;

import javax.validation.Validator;

import javax.validation.ValidatorFactory;



@Configuration

public class ValidatorConf {

    @Bean

    public Validator validator() {

        ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )

                .configure()

                .failFast( true )

                .buildValidatorFactory();

        Validator validator = validatorFactory.getValidator();

        return validator;

    }

}