spring - boot - starter - validation 상용 검사 주해

21971 단어 springboot
의존 pom. xml 도입
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-validationartifactId>
        dependency>

상용 주해
타 입 을 틀 리 지 않도록 주의 하 세 요!
주해
제한 하 다.
@Null
null 로 만 제한
@NotNull
null
@AssertFalse
false 로 제한
@AssertTrue
트 루 로 제한
@DecimalMax(value)
지정 한 값 보다 크 지 않 은 숫자 로 제한 해 야 합 니 다.
@DecimalMin(value)
지정 한 값 보다 작 지 않 은 숫자 로 제한 해 야 합 니 다.
@Digits(integer,fraction)
제한 은 하나의 소수 로 해 야 하 며, 정수 부분의 자릿수 는 integer 를 초과 해 서 는 안 되 며, 소수 부분의 자릿수 는 fraction 을 초과 해 서 는 안 된다.
@Future
제한 은 반드시 미래의 날짜 여야 한다.
@Max(value)
지정 한 값 보다 크 지 않 은 숫자 로 제한 해 야 합 니 다.
@Min(value)
지정 한 값 보다 작 지 않 은 숫자 로 제한 해 야 합 니 다.
@Past
제한 은 반드시 과거의 날짜 여야 한다.
@Pattern(value)
지정 한 정규 표현 식 문자열 에 부합 해 야 함 을 제한 합 니 다.
@Size(max,min)
문자 길 이 를 제한 하려 면 min 에서 max 사이 [숫자 가 아 닙 니 다]
@Past
주 해 를 검증 하 는 요소 값 (날짜 형식) 이 현재 시간 보다 빠 릅 니 다.
@NotEmpty
주 해 를 검증 하 는 요소 값 은 null 이 아니 라 비어 있 지 않 습 니 다 (문자열 길이 0 이 아 닙 니 다. 집합 크기 는 0 이 아 닙 니 다)
@NotBlank
주 해 를 검증 하 는 요소 값 은 비어 있 지 않 습 니 다 (null 이 아 닙 니 다. 첫 번 째 빈 칸 을 제거 한 후 길 이 는 0 입 니 다). @ NotEmpty 와 달리 @ NotBlank 는 문자열 에 만 적용 되 며 비교 할 때 문자열 의 빈 칸 을 제거 합 니 다.
@Email
주 해 를 검증 하 는 요소 값 은 Email 이 며 정규 표현 식 과 flag 를 통 해 사용자 정의 email 형식 을 지정 할 수 있 습 니 다.
@Length(min = 6, max = 16)
들 어 오 는 문자열 의 길 이 를 지정 합 니 다.
사용 할 때:
우선 실체 류 에 검 증 된 주 해 를 넣 습 니 다.
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("user")
public class User implements Serializable {
     

    private static final long serialVersionUID = -5577261004651495987L;

    @TableId(type = IdType.AUTO)
    private Integer userId;


    @NotEmpty
    @Length(min = 6, max = 16, message = "      ") //@Length        
    private String password;
    
    private Integer role;

    private String salt;
    /**
     *        
     */
    @Email(regexp = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$")
    @NotNull
    private String email;

    private Date registerTime;

    @Override
    public String toString() {
     
        String ret = null;
        ObjectMapper mapper = new ObjectMapper();
        try {
     
            ret = mapper.writeValueAsString(this);
        } catch (Exception e) {
     
            e.printStackTrace();
        }
        return ret;
    }
}

그리고 사용자 대상 을 받 을 때 @Valid 또는 @Validated 주 해 를 추가 합 니 다.
메모: spring 이 제공 하 는 인증: org. springframework. vaidation. annotation. Validated;javax 가 제공 하 는 인증: javax. validation. Valid; @Valid 와 @ Validated 는 모두 한 번 의 검 사 를 촉발 하 는 데 사 용 됩 니 다. @ Valid 는 JSR 303 규범 의 주해 입 니 다. @ Validated 는 Spring 강화 판 의 주해 입 니 다. 강 화 된 부분 은 @ Validated 지원 그룹 서열 입 니 다. 이 특성 은 @ Validated 주 해 를 적 게 사용 하 는 것 을 추천 합 니 다.
일치 하지 않 는 상황 을 포착 할 수 있 는 몇 가지 방법 이 있 습 니 다.
방법 1: 전역 이상 포획
@PostMapping("/login")
 public RetJson<Object> login(@Valid @RequestBody User user){
     
	...
 }

전역 이상 을 사용 하여 오류 정 보 를 되 돌려 줍 니 다 (실체 클래스 에 적 힌 message 정보 입 니 다)
@RestControllerAdvice
@Slf4j
public class ExceptionResolver {
     
	/**
     *        
     */
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(value = {
      MethodArgumentNotValidException.class})
    public RetJson methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
     
        log.error("------->MethodArgumentNotValidException    -------- ", e);
        return RetJson.fail(ResultCode.VALIDATE_FAILED.getCode(), "    "+e.getBindingResult().getFieldError().getDefaultMessage());
        //getDefaultMessage()   message  
    }
}

두 번 째: 방법 적 으로 직접 처리
실체 클래스 전 참 시 BindingResult 주 해 를 추가 합 니 다.
또한 주의 BindingResult @ ModelAttribute 의 뒤 를 따라 가 야 합 니 다. 예 를 들 어: Public String add (@ Valid RoleBO role, Binding Result binding, Map request)
public String add (@ Valid RoleBO role, Map request), BindingResult result) 에 다음 과 같이 쓰 면 이상 이 발생 합 니 다. java. lang. IllegalState 예외: An Errors / BindingResult argument is expected to be declared immediately after the model attribute, the @ RequestBody or the @ RequestPart arguments to which they apply:
사실 과정 은:
  • Pojo 류 필드 에 Hibernate validator 주석
  • Controller 함수 의 형 삼 앞 에 @ Valid 또는 @ Validated 주 해 를 추가 하여 vaidation 을 촉발 합 니 다.
  • 각 @ Valid 또는 @ Validated 주석 매개 변 수 를 사용 한 후 BindingResult 형식의 매개 변 수 를 따라 갑 니 다. 해당 하 는 BindingResult 매개 변 수 를 제공 하지 않 으 면 Spring MVC 는 이상 을 던 집 니 다.
  • Controller 함수 에서 BindingResult 형식의 매개 변 수 를 통 해 검사 결 과 를 얻 습 니 다.
  • @PostMapping("/login")
     public RetJson<Object> login(@Valid @RequestBody User user, BindingResult result){
         
    	if (result.hasErrors()) {
         
              log.error("[login]    :User={}", user);
               String s = result.getFieldError().getDefaultMessage();
               throw new BaseException(ResultCode.VALIDATE_FAILED.getCode(), s);
         }
            ...
     }
    

    이렇게 하면 message 의 잘못된 정 보 를 직접 되 돌 릴 수 있다.
    방법 3: 도구 류
    도구 클래스 를 써 서 일치 하지 않 는 상황 이 있 는 지 판단 합 니 다.
    public class ValidatedUtil {
         
        private static Validator validator=
                Validation.byProvider(HibernateValidator.class).configure().failFast(true).buildValidatorFactory().getValidator();
    
        public static<T> Boolean validate(T v){
         
            Set<ConstraintViolation<T>> set= validator.validate(v);
            return set.size() == 0;
        }
    
     	public static void validData(BindingResult bindingResult) {
         
            if (bindingResult.hasErrors()) {
         
                StringBuilder sb = new StringBuilder();
                for (ObjectError error : bindingResult.getAllErrors()) {
         
                    sb.append(error.getDefaultMessage());
                }
                throw new BaseException(ResultCode.VALIDATE_FAILED.getCode(), sb.toString());
            }
        }
    }
    

    물론 단일 매개 변수 도 직접 사용 할 수 있다.
        @GetMapping("/getEmailCode")
    	public RetJson<Object> getEmailCode(
    			@RequestParam("email") @Valid 
    			@Email(regexp = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$", message = "      ") String email) {
         
    		//        MethodArgumentNotValidException          	
    }
    

    좋은 웹페이지 즐겨찾기