복붙노트

[SPRING] 스프링 부트 REST @RequestParam의 유효성이 검사되지 않음

SPRING

스프링 부트 REST @RequestParam의 유효성이 검사되지 않음

그물에서 많은 예제를 시도했지만 Spring이 쿼리 문자열 매개 변수의 유효성을 검사하도록 할 수 없습니다. REGEX / 실패를 실행하지 않는 것 같습니다.

package my.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import javax.validation.constraints.Pattern;

import static org.springframework.web.bind.annotation.RequestMethod.GET;

@RestController
public class MyController {

    private static final String VALIDATION_REGEX = "^[0-9]+(,[0-9]+)*$";

    @RequestMapping(value = "/my/{id}", method = GET)
    public myResonseObject getMyParams(@PathVariable("id") String id,
                                       @Valid @Pattern(regexp = VALIDATION_REGEX) 
                                       @RequestParam(value = "myparam", required = true) String myParam) {
         // Do Stuff!
    }

}

현재 행동

PASS - /my/1?myparam=1
PASS - /my/1?myparam=1,2,3
PASS - /my/1?myparam=
PASS - /my/1?myparam=1,bob

원하는 행동

PASS - /my/1?myparam=1
PASS - /my/1?myparam=1,2,3
FAIL - /my/1?myparam=
FAIL - /my/1?myparam=1,bob

감사

해결법

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

    1.다음과 같이 @Validated를 클래스에 추가해야합니다.

    다음과 같이 @Validated를 클래스에 추가해야합니다.

    @RestController
    @Validated
    class Controller {
      // ...
    }
    

    최신 정보:

    올바르게 구성해야합니다.이 Bean을 컨텍스트에 추가하십시오.

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

    예외를 처리하는 예 :

    @ControllerAdvice
    @Component
    public class GlobalExceptionHandler {
        @ExceptionHandler
        @ResponseBody
        @ResponseStatus(HttpStatus.BAD_REQUEST)
        public Map handle(MethodArgumentNotValidException exception) {
            return error(exception.getBindingResult().getFieldErrors()
                    .stream()
                    .map(FieldError::getDefaultMessage)
                    .collect(Collectors.toList()));
        }
    
    
        @ExceptionHandler
        @ResponseBody
        @ResponseStatus(HttpStatus.BAD_REQUEST)
        public Map handle(ConstraintViolationException exception) {
            return error(exception.getConstraintViolations()
                    .stream()
                    .map(ConstraintViolation::getMessage)
                    .collect(Collectors.toList()));
        }
    
        private Map error(Object message) {
            return Collections.singletonMap("error", message);
        }
    }
    
  2. ==============================

    2.당신은 이것을 시도 할 수 있습니다

    당신은 이것을 시도 할 수 있습니다

    @Pattern(regexp="^[0-9]+(,[0-9]+)*$")
    private static final String VALIDATION_REGEX;
    

    (최종 수정 자에주의하십시오) 그렇지 않으면

     @Pattern()
     private static final String VALIDATION_REGEX = "^[0-9]+(,[0-9]+)*$";
    

    그런 다음 메소드에서 @Pattern (regex = VALIDATION REGEX)을 제거하고 @Valid 주석 만 유지하십시오.

    public myResonseObject getMyParams(@PathVariable("id") String id, @Valid @RequestParam(value = "myparam", required = true) String myParam) {
    
  3. ==============================

    3.정규식이 잘못되었습니다

    정규식이 잘못되었습니다

    "^[0-9]+(,[0-9]+)*$"
    

    절대 파싱하지 않습니다

    1,bob
    

    아마도 다음이 필요합니다.

    "^\w+(,\w+)*$"
    

    빈 줄을 파싱 해야하는 경우 다음을 사용하십시오.

    "^(\w+(,\w+)*)?$"
    
  4. from https://stackoverflow.com/questions/38614903/spring-boot-rest-requestparam-not-being-validated by cc-by-sa and MIT license