2014-03-05 2 views
1

MethodArgumentNotValidException 및 ConstraintViolationException에 주어진 필드/개체 이름을 사용자 지정할 수있는 방법을 찾고 있습니다.유효성 검사 실패로 인해 반환 된 필드 이름을 어떻게 사용자 정의 할 수 있습니까?

여기에 컨텍스트가 있습니다. 서버에서 유효성 검사를 수행하고 있지만 서버 유효성 오류를 다시 클라이언트의 입력 필드에 매핑하여 UI의 입력에 서버 오류를 직접 표시하려고합니다. 지시문을 서버에서 인식 할 수있는 ID를 가지고있는 한 이런 일이 발생할 수있는 각도 지시문을 사용하고 있습니다.

저는 현재 서버 측 유효성 검사를 수행하는 데 거의 모든 주석을 사용하고 있으며이를 계속 유지하고자합니다. (javax.validation.Validator를 통해) 프로그래밍을 통해 유효성 검사를 수행하면 예외가 채워지고 throw되는 방식을 제어하므로 예외에서 throw되는 내용을 사용자 정의 할 수 있습니다.

내가 지금까지 해왔 던 유일한 해결책은 @Valid 주석을 대체 할 자체 유효성 검사기를 만들어 클라이언트 측 ID와 서버 측 필드를 매핑하는 자체 논리를 적용하는 것입니다.

하지만 ....이 느낌이 옳지 않으며 이것을 시도하는 데 숨겨진 함정이있을 수 있습니다. 나는 또한 이것이 누군가가 이것을 할 필요가있는 처음이라는 것을 기대하지 않을 것이다. 그래서, 당신이 말하는 stackoverflow의 똑똑한 사람들?

+1

그래서 당신은 bean validator 프레임 워크를 사용하고 있습니까? [이와 비슷한 것] (http://jaxenter.com/integrating-bean-validation-with-jax-rs-48461.html)을 찾고 계십니까? –

답변

1

MethodArgumentNotValidExceptionConstraintViolationException을 처리하는 @ExceptionHandler에 매핑을 넣을 수 있습니다. 다음은 전자의 예입니다. 음이 아닌 것으로

import javax.validation.constraints.Min; 

public class Foo { 

    private int bar; 

    @Min(0) 
    public int getBar() { 
     return bar; 
    } 

    public void setBar(int bar) { 
     this.bar = bar; 
    } 
} 

bar 요구 :

개체 Foo 가정한다. 여기 컨트롤러가 있습니다.

{"foobar":"must be greater than or equal to 0"}

난 당신이 훨씬 더이 있으리라 믿고있어 : 데이터 { "bar":"-1" }와 POST 전송

import internal.sandbox.domain.Foo; 
import org.springframework.http.HttpStatus; 
import org.springframework.http.ResponseEntity; 
import org.springframework.stereotype.Controller; 
import org.springframework.validation.FieldError; 
import org.springframework.web.bind.MethodArgumentNotValidException; 
import org.springframework.web.bind.annotation.*; 

import javax.validation.Valid; 
import java.util.HashMap; 
import java.util.Map; 

@Controller 
public class SomeController { 

    @ExceptionHandler(MethodArgumentNotValidException.class) 
    @ResponseStatus(HttpStatus.BAD_REQUEST) 
    @ResponseBody 
    public Map<String,String> handleValidationFailure(MethodArgumentNotValidException e) { 

     Map<String, String> errors = new HashMap<>(); 

     for (FieldError fieldError : e.getBindingResult().getFieldErrors()) { 
      errors.put(fieldError.getObjectName() + fieldError.getField(), 
         fieldError.getDefaultMessage()); 
     } 

     return errors; 
    } 

    @RequestMapping(value = "/", method = RequestMethod.POST, consumes = "application/json") 
    public ResponseEntity<?> post(@Valid @RequestBody Foo foo) { 

     return new ResponseEntity<>(HttpStatus.OK); 
    } 
} 

다음과 같은 응답 본문과 404의 결과로 @ExceptionHandler에 의해 처리되는 MethodArgumentNotValidException를 던졌습니다 더 똑똑한 @ExceptionHandler 당신 물건을 더 잘 맵핑 할 수 있지만, 에있는 Set<ConstraintViolations> 필드처럼 예외는 필요한 모든 것을 가지고 있습니다. 이 시점에서 AngularJS 서비스는 POST를 한 $http 약속의 거부를 확인하고 오류 정보를 처리하는 현장의 날을 가질 수 있습니다.

최대 절전 모드에서 처리 된 ConstraintViolationException과 비슷한 @ExceptionHandler을 작성할 수 있습니다.

+1

ControlerAdvice 내에서 이미 ExceptionHandler를 사용하고 있지만, 필요한 모든 데이터를 갖는 예외에 대한 의견은 트릭입니다. 유효성 검사가 발생한 객체를 사용할 수 없다고 생각했지만 실제로는 실제로 액세스했습니다. 이를 통해 리플렉션을 사용하여 클라이언트 측 모델과 서버 측 객체에서 매핑을 얻을 수 있습니다. 감사! – Noremac