Um zu verhindern, dass illegale Parameter das Geschäft beeinträchtigen, ist es häufig erforderlich, die Parameter der Schnittstelle zu überprüfen. Beispielsweise muss bei der Protokollierung überprüft werden, ob der Benutzername und das Kennwort leer sind in und beim Hinzufügen eines Benutzers. Sind die Formate der E-Mail-Adresse und der Mobiltelefonnummer des Benutzers korrekt? Es wäre zu umständlich, sich auf Code zu verlassen, um die Schnittstellenparameter einzeln zu überprüfen, und die Lesbarkeit des Codes wäre äußerst schlecht.
Validator
Das Framework soll Entwicklern helfen, während der Entwicklung weniger Code zu schreiben und die Entwicklungseffizienz zu verbessern. Der Validator wird speziell zur Überprüfung von Schnittstellenparametern verwendet, z. B. zur Überprüfung allgemeiner Anforderungen und zur Überprüfung des E-Mail-Formats. Der Benutzername muss zwischen 6 und 12 liegen und so weiter.
Als nächstes werfen wir einen Blick darauf, wie das Parameterüberprüfungs-Framework in SpringbBoot integriert wird.
@Max | Das Maximum darf diesen Maximalwert nicht überschreiten |
---|---|
@Min | Das Maximum darf diesen Minimalwert nicht unterschreiten |
@NotNull | kann nicht null sein, kann leer sein |
@Null | muss null sein |
@Pattern | muss den angegebenen regulären Ausdruck erfüllen |
@Size | Größe von Sammlungen, Arrays, Karten usw. ()Der Wert muss innerhalb des angegebenen Bereichs liegen |
Muss im E-Mail-Format vorliegen | |
@Length | Die Länge muss innerhalb des angegebenen Bereichs liegen |
@NotBlank | String darf nicht null sein, string Nach trim() ist dies nicht möglich gleich „“ sein |
@NotEmpty | Die Größe() von Sammlungen, Arrays, Karten usw. darf nicht 0 sein; nach trim() kann die Zeichenfolge gleich „“ |
@Range | Der Wert muss innerhalb des angegebenen Bereichs liegen |
@URL | muss eine URL sein |
1.3定义校验类进行测试package com.didiplus.modules.sys.controller; import com.didiplus.modules.sys.domain.SysDictType; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.v3.oas.annotations.parameters.RequestBody; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * Author: didiplus * Email: 972479352@qq.com * CreateTime: 2022/4/25 * Desc: 数据字典控制器 */ @RestController @Api(tags = "数据字典") @RequestMapping("/api/sys/dictType") public class SysDictTypeController { @ApiOperation("字典添加") @PostMapping("/add") public SysDictType add(@Validated @RequestBody SysDictType sysDictType) { return sysDictType; } @ApiOperation("字典修改") @PutMapping("/edit") public SysDictType edit(@Validated @RequestBody SysDictType sysDictType) { return sysDictType; } } Nach dem Login kopieren 这里我们先定义两个方法 1.4打开接口文档模拟提交数据通过接口文档看到前三个字段都是必填项。 由于email的格式不对就被拦截了,提示是因为邮箱地址不对。 2.参数异常加入全局异常处理器虽然我们之前定义了全局异常拦截器,也看到了拦截器确实生效了,但是 直接修改之前定义的
代码如下: package com.didiplus.common.web.response.Handler; import com.didiplus.common.web.response.Result; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.validation.BindException; import org.springframework.validation.ObjectError; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; import javax.validation.ValidationException; import java.util.stream.Collectors; /** * Author: didiplus * Email: 972479352@qq.com * CreateTime: 2022/4/24 * Desc: 默认全局异常处理。 */ @RestControllerAdvice public class RestExceptionHandler { /** * 默认全局异常处理。 * @param e the e * @return ResultData */ @ExceptionHandler(value = {BindException.class, ValidationException.class, MethodArgumentNotValidException.class}) public ResponseEntity<Result<String>> handleValidatedException(Exception e) { Result<String> result = null; if (e instanceof MethodArgumentNotValidException) { MethodArgumentNotValidException ex =(MethodArgumentNotValidException) e; result = Result.failure(HttpStatus.BAD_REQUEST.value(), ex.getBindingResult().getAllErrors().stream() .map(ObjectError::getDefaultMessage) .collect(Collectors.joining(";")) ); } else if (e instanceof ConstraintViolationException){ ConstraintViolationException ex = (ConstraintViolationException) e; result = Result.failure(HttpStatus.BAD_REQUEST.value(), ex.getConstraintViolations().stream() .map(ConstraintViolation::getMessage) .collect(Collectors.joining(";")) ); }else if (e instanceof BindException) { BindException ex = (BindException ) e; result = Result.failure(HttpStatus.BAD_REQUEST.value(), ex.getAllErrors().stream() .map(ObjectError::getDefaultMessage) .collect(Collectors.joining(";")) ); } return new ResponseEntity<>(result,HttpStatus.BAD_REQUEST); } } Nach dem Login kopieren 美化之后错误信息提示更加友好 3.自定义参数校验虽然Spring Validation 提供的注解基本上够用,但是面对复杂的定义,我们还是需要自己定义相关注解来实现自动校验。 3.1创建自定义注解package com.didiplus.common.annotation; import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.Documented; import java.lang.annotation.Repeatable; import java.lang.annotation.Retention; import java.lang.annotation.Target; import static java.lang.annotation.ElementType.*; import static java.lang.annotation.RetentionPolicy.RUNTIME; /** * Author: didiplus * Email: 972479352@qq.com * CreateTime: 2022/4/26 * Desc: */ @Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE}) @Retention(RUNTIME) @Repeatable(EnumString.List.class) @Documented @Constraint(validatedBy = EnumStringValidator.class)//标明由哪个类执行校验逻辑 public @interface EnumString { String message() default "value not in enum values."; Class<?>[] groups() default {}; Class<? extends Payload>[] palyload() default {}; /** * @return date must in this value array */ String[] value(); /** * Defines several {@link EnumString} annotations on the same element. * * @see EnumString */ @Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE}) @Retention(RUNTIME) @Documented @interface List { EnumString[] value(); } } Nach dem Login kopieren 3.2自定义校验逻辑package com.didiplus.common.annotation; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import java.util.Arrays; import java.util.List; /** * Author: didiplus * Email: 972479352@qq.com * CreateTime: 2022/4/26 * Desc: */ public class EnumStringValidator implements ConstraintValidator<EnumString,String> { private List<String> enumStringList; @Override public void initialize(EnumString constraintAnnotation) { enumStringList = Arrays.asList(constraintAnnotation.value()); } @Override public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) { if(value == null) { return true; } return enumStringList.contains(value); } } Nach dem Login kopieren 3.3在字段上增加注解@ApiModelProperty(value = "性别") @EnumString(value = {"F","M"}, message="性别只允许为F或M") private String sex; Nach dem Login kopieren 3.4体验效果4.分组校验一个对象在新增的时候某些字段是必填,在更新是有非必填。如上面的 其实 4.1定义分组接口package com.didiplus.common.base; import javax.validation.groups.Default; /** * Author: didiplus * Email: 972479352@qq.com * CreateTime: 2022/4/26 * Desc: */ public interface ValidGroup extends Default { interface Crud extends ValidGroup{ interface Create extends Crud{ } interface Update extends Crud{ } interface Query extends Crud{ } interface Delete extends Crud{ } } } Nach dem Login kopieren 4.2在模型中给参数分配分组@Null(groups = ValidGroup.Crud.Create.class) @NotNull(groups = ValidGroup.Crud.Update.class,message = "字典ID不能为空") @ApiModelProperty("ID") private String id; Nach dem Login kopieren 4.3体现效果 |
Das obige ist der detaillierte Inhalt vonWie führt SpringBoot eine Parameterüberprüfung durch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!