복붙노트

[SPRING] Spring Web MVC - 개별 요청 매개 변수 유효성 검사

SPRING

Spring Web MVC - 개별 요청 매개 변수 유효성 검사

Spring Web MVC 3.0에서 webapp를 실행 중이며 대략 다음과 같은 서명을 가진 컨트롤러 메소드가 있습니다.

@RequestMapping(value = "/{level1}/{level2}/foo", method = RequestMethod.POST)
public ModelAndView createFoo(@PathVariable long level1,
        @PathVariable long level2,
        @RequestParam("foo_name") String fooname,
        @RequestParam(value = "description", required = false) String description);

몇 가지 유효성 검사를 추가하고 싶습니다. 예를 들어 설명을 특정 길이로 제한해야하며, 그렇지 않으면 특정 문자 만 포함해야합니다. 이 유효성 검사가 실패하면 데이터를 DAO 레이어로 통과시키지 않으면 어떤 예외가 발생하지 않고 사용자에게 메시지를 반환하려고합니다. JSR303에 대해 알고 있지만 Spring Context에서 적용하는 방법을 이해하지 못했습니다.

내가 이해할 수있는 또 다른 옵션은 @RequestBody를 전체 도메인 객체에 바인딩하고 거기에 유효성 검사 제약 조건을 추가하는 것이지만 현재는 위의 그림과 같이 개별 코드를 허용하도록 코드가 설정되어 있습니다.

이 접근법을 사용하여 입력 매개 변수에 유효성 검사를 적용하는 가장 직접적인 방법은 무엇입니까?

해결법

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

    1.아무 것도 아직 내장되어 있지 않습니다. 현재 릴리스 버전에서는 자동 검증을 원할 경우 WebDataBinder를 사용하여 매개 변수를 객체에 바인딩해야합니다. SpringMVC를 사용한다면이 작업을위한 첫 번째 선택이 아닐지라도 배우는 것이 좋습니다.

    아무 것도 아직 내장되어 있지 않습니다. 현재 릴리스 버전에서는 자동 검증을 원할 경우 WebDataBinder를 사용하여 매개 변수를 객체에 바인딩해야합니다. SpringMVC를 사용한다면이 작업을위한 첫 번째 선택이 아닐지라도 배우는 것이 좋습니다.

    다음과 같이 보입니다.

    public ModelAndView createFoo(@PathVariable long level1,
            @PathVariable long level2,
            @Valid @ModelAttribute() FooWrapper fooWrapper,
            BindingResult errors) {
      if (errors.hasErrors() {
         //handle errors, can just return if using Spring form:error tags.
      }
    }
    
    public static class FooWrapper {
      @NotNull
      @Size(max=32)
      private String fooName;
      private String description;
    //getset
    }
    

    클래스 패스에 Hibernate Validator 4 나 그 이후 버전이 있고 기본 디스패처 설정을 사용한다면 "그냥 작동"해야합니다.

    코멘트가 종류의 큰 종류를 얻고 있었기 때문에 편집 :

    HttpRequest, ModelMap 등과 같이 Spring이 주입하는 방법을 알고있는 '예상 된'것이 아닌 메소드 서명에있는 모든 객체는 데이터 바인딩을 가져옵니다. 이것은 bean 프라퍼티 이름과 호출 setter에 대해 요청 param 이름을 일치시키는 것만으로 간단한 경우에 수행됩니다. @ModelAttribute는 개인 스타일 일 뿐이며,이 경우 아무 것도하지 않습니다. 메서드 매개 변수의 @Valid와 JSR-303의 통합은 WebDataBinder를 통해 연결됩니다. @RequestBody를 사용하는 경우 요청 본문 (일반적으로 HTTP 헤더에서 오는 것)에 대한 컨텐츠 유형 스프링 결정에 따라 객체 마샬 러를 사용합니다. Dispatcher 서블릿 (AnnotationMethodHandlerAdapter)은 임의의 마샬 러 (marshaller)를위한 '검증 스위치' 그냥 웹 요청 콘텐츠를 메시지 변환기로 전달하고 Object를 다시 가져옵니다. BindingResult 객체가 생성되지 않으므로 오류를 설정하지 않아도됩니다.

    컨트롤러에 유효성 검사기를 삽입하고 가져온 객체에서 실행할 수 있습니다. BindingResult를 채우는 요청 매개 변수의 @Valid와 마술 통합이 필요하지 않습니다.

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

    2.이것은 현재 가능할 것 같습니다 (Spring 4.1.2로 시도). https://raymondhlee.wordpress.com/2015/08/29/validating-spring-mvc-request-mapping-method-parameters/

    이것은 현재 가능할 것 같습니다 (Spring 4.1.2로 시도). https://raymondhlee.wordpress.com/2015/08/29/validating-spring-mvc-request-mapping-method-parameters/

    위의 페이지에서 추출 :

  3. ==============================

    3.(Http GET 또는 POST를 사용하여) 유효성 검사가 필요한 여러 요청 매개 변수가있는 경우. 커스텀 모델 클래스를 생성하고 @ModelAttribute와 함께 @Valid를 사용하여 매개 변수의 유효성을 검사 할 수도 있습니다. 이 방법으로 Hibernate Validator 또는 javax.validator api를 사용하여 params의 유효성을 검사 할 수 있습니다. 그것은 다음과 같이됩니다.

    (Http GET 또는 POST를 사용하여) 유효성 검사가 필요한 여러 요청 매개 변수가있는 경우. 커스텀 모델 클래스를 생성하고 @ModelAttribute와 함께 @Valid를 사용하여 매개 변수의 유효성을 검사 할 수도 있습니다. 이 방법으로 Hibernate Validator 또는 javax.validator api를 사용하여 params의 유효성을 검사 할 수 있습니다. 그것은 다음과 같이됩니다.

    요청 방법 :

    @RequestMapping(value="/doSomething", method=RequestMethod.GET)
    public Model dosomething(@Valid @ModelAttribute ModelRequest modelRequest, BindingResult result, Model model) {
    
        if (result.hasErrors()) {
            throw new SomeException("invalid request params");
        }
    
        //to access the request params
        modelRequest.getFirstParam();
        modelRequest.getSecondParam();
    
        ...   
    }
    

    ModelRequest 클래스 :

    class ModelRequest {
    
        @NotNull
        private String firstParam;
    
        @Size(min = 1, max = 10, message = "You messed up!")
        private String secondParam;
    
        //Setters and getters
    
        public void setFirstParam (String firstParam) {
            this.firstParam = firstParam;
        }
    
        public String getFirstParam() {
            return firstParam;
        }
    
        ...
    }
    

    희망이 도움이됩니다.

  4. from https://stackoverflow.com/questions/6203740/spring-web-mvc-validate-individual-request-params by cc-by-sa and MIT license