복붙노트

[SPRING] 스프링 4에서 @PathVariable 검증

SPRING

스프링 4에서 @PathVariable 검증

어떻게 봄에 내 경로 변수의 유효성을 검사 할 수 있습니까? 유일한 필드는 Pojo로 이동하고 싶지 않기 때문에 id 필드의 유효성을 검사하고 싶습니다.

@RestController
public class MyController {
    @RequestMapping(value = "/{id}", method = RequestMethod.PUT)
    public ResponseEntity method_name(@PathVariable String id) {
        /// Some code
    }
}

경로 변수에 유효성 검사를 추가하는 것을 시도했지만 작동하지 않습니다.

    @RestController
    @Validated
public class MyController {
    @RequestMapping(value = "/{id}", method = RequestMethod.PUT)
    public ResponseEntity method_name(
            @Valid 
            @Nonnull  
            @Size(max = 2, min = 1, message = "name should have between 1 and 10 characters") 
            @PathVariable String id) {
    /// Some code
    }
}

해결법

  1. ==============================

    1.Spring 설정에서 빈을 생성해야한다.

    Spring 설정에서 빈을 생성해야한다.

     @Bean
        public MethodValidationPostProcessor methodValidationPostProcessor() {
             return new MethodValidationPostProcessor();
        }
    

    컨트롤러에 @Validated 주석을 남겨 두어야합니다.

    ConstraintViolationException을 처리하려면 컨트롤러 클래스에 Exception Handler가 필요합니다.

    @ExceptionHandler(value = { ConstraintViolationException.class })
        @ResponseStatus(value = HttpStatus.BAD_REQUEST)
        public String handleResourceNotFoundException(ConstraintViolationException e) {
             Set<ConstraintViolation<?>> violations = e.getConstraintViolations();
             StringBuilder strBuilder = new StringBuilder();
             for (ConstraintViolation<?> violation : violations ) {
                  strBuilder.append(violation.getMessage() + "\n");
             }
             return strBuilder.toString();
        }
    

    변경이 끝나면 유효성 검사가 실행될 때 메시지가 표시됩니다.

    추신 : 저는 방금 여러분의 @Size 검증을 시도했습니다.

  2. ==============================

    2.이 목표를 보관하려면 응답 메시지를 실제 유효성 검사기와 같게하려면이 해결 방법을 적용하십시오.

    이 목표를 보관하려면 응답 메시지를 실제 유효성 검사기와 같게하려면이 해결 방법을 적용하십시오.

    @GetMapping("/check/email/{email:" + Constants.LOGIN_REGEX + "}")
    @Timed
    public ResponseEntity isValidEmail(@Email @PathVariable(value = "email") String email) {
        return userService.getUserByEmail(email).map(user -> {
            Problem problem = Problem.builder()
                .withType(ErrorConstants.CONSTRAINT_VIOLATION_TYPE)
                .withTitle("Method argument not valid")
                .withStatus(Status.BAD_REQUEST)
                .with("message", ErrorConstants.ERR_VALIDATION)
                .with("fieldErrors", Arrays.asList(new FieldErrorVM("", "isValidEmail.email", "not unique")))
                .build();
            return new ResponseEntity(problem, HttpStatus.BAD_REQUEST);
        }).orElse(
            new ResponseEntity(new UtilsValidatorResponse(EMAIL_VALIDA), HttpStatus.OK)
        );
    }
    
  3. ==============================

    3.나는 @RequestMapping ( "/")의 문제라고 생각한다. @requestMapping ( "/")을 클래스에 추가 한 다음 @pathVariable을 사용합니다.

    나는 @RequestMapping ( "/")의 문제라고 생각한다. @requestMapping ( "/")을 클래스에 추가 한 다음 @pathVariable을 사용합니다.

    @RestController
    @RequestMapping("/xyz")
    public class MyController {
    
        @RequestMapping(value = "/{id}", method = RequestMethod.PUT)
        public ResponseEntity method_name(@PathVariable String id) {
          /// Some code
        }
    }
    
  4. from https://stackoverflow.com/questions/35403744/pathvariable-validation-in-spring-4 by cc-by-sa and MIT license