programing

Spring Web MVC - 개별 요청 매개변수 검증

muds 2023. 9. 18. 22:43
반응형

Spring Web MVC - 개별 요청 매개변수 검증

저는 Spring Web MVC 3.0에서 웹앱을 실행하고 있으며, 서명이 대략 다음과 같은 많은 컨트롤러 방법을 가지고 있습니다.

@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);

몇 가지 검증을 추가하고 싶습니다. 예를 들어,description특정 또는한야다로.fooname특정 문자만 포함해야 합니다.이 유효성 검사에 실패할 경우 확인되지 않은 예외를 그냥 두는 대신 사용자에게 메시지를 반환하고 싶습니다(데이터가 DAO 계층까지 침투하게 하면 어쨌든 발생합니다).저는 JSR303에 대해 알고 있지만, JSR303과 함께 작업한 적이 없으며 봄의 맥락에서 적용하는 방법을 잘 모르겠습니다.

제가 알기로는, 또 다른 선택지는 제가 당신을 구속하는 것일 것입니다.@RequestBody전체 도메인 개체에 유효성 검사 제약 조건을 추가합니다. 그러나 현재 내 코드는 위와 같이 개별 매개 변수를 허용하도록 설정되어 있습니다.

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

이제 가능할 것으로 보입니다(스프링 4.1.2와 비교). https://raymondhlee.wordpress.com/2015/08/29/validating-spring-mvc-request-mapping-method-parameters/ 를 참조하십시오.

위 페이지에서 추출:

  1. MethodValidationPostProcessor를 Spring @Configuration 클래스에 추가:

    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        return new MethodValidationPostProcessor();
    }
    
  2. @Validated를 컨트롤러 클래스에 추가

  3. @RequestParam 직전에 @Size 사용

    @RequestMapping("/hi")
    public String sayHi(@Size(max = 10, message = "name should at most 10 characters long") @RequestParam("name") String name) {
        return "Hi " + name;
    

    }

  4. 핸들 구속조건 위반@ExceptionHandler 메서드의 예외

그렇게 할 수 있는 내장된 것은 아직 없습니다.현재 릴리스 버전에서는 자동 유효성 검사를 원하는 경우 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 이상이 있고 기본 디스패처 설정을 사용하는 경우 "그냥 작동"해야 합니다.

댓글이 커졌기 때문에 편집:

Spring이 주입하는 방법을중 모든 예: ' ' ' 가 는 이 을 하는 에 을 하는 이 에 ) 예를 들어,HttpRequest,ModelMap, 등은 데이터 바인딩을 받습니다.이는 단순한 경우에 대해서는 요청 매개 변수 이름과 bean 속성 이름 및 호출 설정자를 일치시키기만 하면 가능합니다.@ModelAttribute개인적인 스타일이 있을 뿐 이 경우에는 아무것도 하지 않습니다.@Valid 와의 JSR-303 통합은 메소드 파라미터를 통해 연결합니다.WebDataBinder. 사용하는 경우@RequestBody, 요청 본문에 대해 스프링이 결정하는 내용 유형에 기반한 개체 마샬러를 사용하고 있습니다(보통 http 헤더에서만).발송인 서블릿(AnnotationMethodHandlerAdapter실제로) 임의의 마샬러에 대해 '검증 스위치를 변경'할 수 있는 방법이 없습니다.웹 요청 내용을 메시지 변환기로 전달하고 개체를 반환하면 됩니다.BindingResult 개체가 생성되지 않으므로 Errors를 설정할 곳이 없습니다.

여전히 컨트롤러에 validator를 주입하여 얻은 개체에서 실행할 수 있습니다. 마법과 통합되지 않습니다.@Valid요청 매개 변수에 다음 정보를 채웁니다.BindingResult널 위해서.

검증해야 할 요청 매개 변수가 여러 개 있는 경우(Http GET 또는 POST 사용).사용자 지정 모델 클래스를 생성하고 @Valid와 @ModelAttribute를 함께 사용하여 매개 변수의 유효성을 검사할 수도 있습니다.이렇게 하면 Hibernate Validator 또는 javax.validator api를 사용하여 매개 변수의 유효성을 검사할 수 있습니다.이런 식으로 진행됩니다.

요청 방법:

@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;
    }

    ...
}

도움이 되길 바랍니다.

언급URL : https://stackoverflow.com/questions/6203740/spring-web-mvc-validate-individual-request-params

반응형