복붙노트

[SPRING] 이 스프링 MVC 컨트롤러에서 오류 상태 및 유효성 검사 오류를 반환하는 방법은 무엇입니까?

SPRING

이 스프링 MVC 컨트롤러에서 오류 상태 및 유효성 검사 오류를 반환하는 방법은 무엇입니까?

내 컨트롤러 중 하나에서 이와 같이 정의 된 동작 메서드가 있습니다.

@RequestMapping(method = RequestMethod.POST)
public @ResponseBody Post create(@Valid Post post, BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
        // how to return an error status + error messages from here?
    } else {
        postRepository.persist(post);
        return post;
    }
}

게시물이 성공적으로 지속되면 게시물을 클라이언트에게 반환합니다. 그러나 유효성 검사 오류가 발생하면 모든 유효성 검사 오류 메시지와 함께 오류 상태 코드를 클라이언트에 반환하려고합니다.

이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

해결법

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

    1.사인 당신은 REST api를 desigining, horaceman에 의해 명시된 바와 같이 이상한 행동이나 유효성 오류를 나타내는 자신의 Pojo (일명 자원)를 만들어야합니다. 우리가 우리의 적용에서 어떻게하는지 보여 드리겠습니다.

    사인 당신은 REST api를 desigining, horaceman에 의해 명시된 바와 같이 이상한 행동이나 유효성 오류를 나타내는 자신의 Pojo (일명 자원)를 만들어야합니다. 우리가 우리의 적용에서 어떻게하는지 보여 드리겠습니다.

    JSON을 데이터 표현으로 사용하기 때문에 예기치 않은 예외가 발생하면 다음 정보를 받기를 원합니다.

    { "status" : "EXCEPTION", "exceptionName" : "MyCustomException", "exceptionMsg" : "ex.unsupportedOperation" }
    

    이것은 물론 예입니다. 좋은 해결책은 프론트 엔드에서 exceptionMsg를 키로 처리하여 올바른 i18n 메시지를 표시하거나 그대로 사용자에게 표시하는 것입니다 (이 경우 더 자세한 메시지를 사용합니다).

    자, 이제 모든 것이 OK가되면 다음과 같이됩니다 :

    { "status" : "OK", "data" : {(...)} }
    

    데이터 요소는 선택 사항입니다. 프론트 엔드에 알리기 위해 필요한 모든 것을 보내거나 완전히 건너 뛸 수 있습니다.

    마지막 시나리오는 유효성 검증 오류 일 것입니다. 이 경우 일반적으로 다음과 같은 콘텐츠를 전송합니다.

    { "status" : "VALIDATION_FAILED", "errors" : [ "fieldName" : "username", "errorCode" : "validation.requiredField", "errorMsg" : "Username is required."] }
    

    명확하게 API 클라이언트는 유효성 검사가 실패한 정보와 적절한 필드에서 무엇이 잘못되었는지에 대한 세부 정보를 받게됩니다. 물론 오류는 배열 (또는 List)이므로 필요한만큼 많은 세부 정보를 제공합니다.

    나는 그것을 어떻게 하는가? 쉬운, 그 개체는 잭슨을 사용하여 JSON으로 변환되는 간단한 POJOS입니다. 이것은 JSON 표현의 무한한 가능성을 제공합니다. 내가하는 일은, Validation 오류 (예를 들어)를 나타내는 POJO를 준비하고 그것을 Model로 ModelAndView 인스턴스에 추가하는 것입니다. 그런 다음 JSON 마샬링을 수행하기 위해 Spring을 사용합니다.

    귀하의 경우 Post 인스턴스에 @ResponseBody 주석이 있으므로 가능한 한 알 수 없습니다. 설정은 "글쎄, 무슨 일이 일어나 든 항상 포스트의 인스턴스를 반환합니다."라고 말합니다. 해야 할 일은 간단한 ModelAndView로 바꾸고, 유효성 검사를 기반으로 적절한 Model을 제공하고 클라이언트 API에 반환하는 것입니다.

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

    2.@ResponseBody의 경우 BindigResult를 메서드 시그니처에서 제거하고 BindException을 던져 보겠습니다. 그런 다음 @ExceptionHandler 메서드를 사용하여 설명 된대로 오류가 포함 된 개체를 반환합니다.

    @ResponseBody의 경우 BindigResult를 메서드 시그니처에서 제거하고 BindException을 던져 보겠습니다. 그런 다음 @ExceptionHandler 메서드를 사용하여 설명 된대로 오류가 포함 된 개체를 반환합니다.

    @RequestMapping(method = RequestMethod.POST)
    public @ResponseBody Post create(@Valid Post post) {
        postRepository.persist(post);
        return post;
    }
    
    @ExceptionHandler
    public ValidationErrors handleException(BindException ex) {
      // ...
    }
    
  3. ==============================

    3.나는 당신이 당신의 컨트롤러에서 아약스 전화를하고 싶다고 생각한다. 메서드에서 게시물 객체를 반환하므로 다른 객체 (예 : 코드가있는 오류 메시지)를 반환 할 수 없습니다. ExecutionResult를 대신 반환하는 방법은 무엇입니까?

    나는 당신이 당신의 컨트롤러에서 아약스 전화를하고 싶다고 생각한다. 메서드에서 게시물 객체를 반환하므로 다른 객체 (예 : 코드가있는 오류 메시지)를 반환 할 수 없습니다. ExecutionResult를 대신 반환하는 방법은 무엇입니까?

    ExecutionResult{
     private int statusCode;
     private String message;
     private Object yourPost;
     //get and set methods here...
    }
    
  4. from https://stackoverflow.com/questions/9337824/how-to-return-error-status-and-validation-errors-from-this-spring-mvc-controller by cc-by-sa and MIT license