-
spring boot- validation (@Valid) 스프링에서 밸리데이션 처리하기WEB/BACK 2022. 2. 1. 14:18반응형
spring boot에서 제공하는 기본 메소드 사용하기
1. DTO 에 원하는 변수 위에다가 @
@Email private String email; @Pattern(regexp = "^\\d{2,3}-\\d{3,4}-\\d{4}$",message = "폰 번호 오류") private String phoneNumber; @Size(min=6, max=6) private String reqYearMonth;//yyyyMM
2. controller 에서 @Valid 어노테이션 추가
@PostMapping("/user") public User user(@Valid @RequestBody User user){ System.out.println(user); return user; }
2-2. error결과를 구체적으로 알아오기 BindingResult에 담아옴
@PostMapping("/user") public ResponseEntity user(@Valid @RequestBody User user, BindingResult bindingResult) { if (bindingResult.hasErrors()) { StringBuilder sb = new StringBuilder(); bindingResult.getAllErrors().forEach(objectError -> { FieldError field = (FieldError) objectError; String message = objectError.getDefaultMessage(); System.out.println("field :" + field.getField()); System.out.println(message); sb.append(("field:" + field.getField())); sb.append("message : " + message); }); return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(sb.toString()); } return ResponseEntity.status(HttpStatus.OK).body("잘됨"); }
결과 확인
사용자 커스텀 밸리데이션
1. AssertTrue사용
@AssertTrue(message = "형식에 맞지 않습니다...")//true로 리턴되어야한다. public boolean isReqYearMonthVali(){//boolean type 은 method명을 is로 시작 System.out.println("isRequestYearMonth....validation"); try { LocalDate localDate = LocalDate.parse(getReqYearMonth()+"01", DateTimeFormatter.ofPattern("yyyyMMdd")); }catch(Exception e){ return false; } return true; }
설정한 message 를 사용한다.
2. 사용자가 어노테이션 만들기
2-1. email.java에서 복사해와서 새로 만든 파일에 붙혀넣기
package com.example.validation.annotation; import com.example.validation.validator.YearMonthValidator; import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.Retention; import java.lang.annotation.Target; import static java.lang.annotation.ElementType.*; import static java.lang.annotation.ElementType.TYPE_USE; import static java.lang.annotation.RetentionPolicy.RUNTIME; @Constraint(validatedBy = {YearMonthValidator.class})//사용자가 생성 @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) @Retention(RUNTIME) public @interface ReqYearMonth { String message() default "{yyyyMM 형식에 안맞는다...}"; Class<?>[] groups() default { }; Class<? extends Payload>[] payload() default { }; String pattern() default "yyyyMM";//추가한 부분 }
validator class만들기
package com.example.validation.validator; import com.example.validation.annotation.ReqYearMonth; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import java.time.LocalDate; import java.time.format.DateTimeFormatter; public class YearMonthValidator implements ConstraintValidator<ReqYearMonth,String> { private String pattern; @Override public void initialize(ReqYearMonth constraintAnnotation) { ConstraintValidator.super.initialize(constraintAnnotation); } @Override public boolean isValid(String value, ConstraintValidatorContext context) { System.out.println("isRequestYearMonth....validator,..!"); try { LocalDate localDate = LocalDate.parse(value+"01", DateTimeFormatter.ofPattern("yyyyMMdd")); }catch(Exception e) { return false; } return true; } }
반응형'WEB > BACK' 카테고리의 다른 글
[도서] Real MySQL 8.0 -1권 - 인덱스 (0) 2022.05.17 [JAVA] Map 을 JSONObject로 변환,List<Map<String, Object>> 을 JSONArray로 변환 (0) 2022.05.10 [JAVA] 특정값(String)이 LIST 또는 다른 String 에 존재하는지 여부 알기 (Arrays.asList, contains) (0) 2022.01.07 [JAVA] 문자열을 잘라서 list로 가져오기 (split, Arrays.asList) (0) 2022.01.07 [JAVA] Map 정리(LinkedHashMap, containKey, keySet(),Map 합치기putAll,순서보장하는 Map) (0) 2021.12.06