簡體   English   中英

DefaultErrorAttributes覆蓋的MethodArgumentNotValidException處理

[英]Handling of MethodArgumentNotValidException overridden by DefaultErrorAttributes

我的目標是為驗證錯誤創建一個自定義響應正文。 這是一個很常見的情況,我讀過很多帖子/博客/文章,甚至我自己過去也已經實現了。 由於某些原因,我無法弄清楚。

我有這個@RestControllerAdvice

@Slf4j
@RequiredArgsConstructor
@RestControllerAdvice
public class ErrorHandler extends ResponseEntityExceptionHandler {

  private final MessageSource messageSource;

  @Override
  protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
      HttpHeaders headers, HttpStatus status, WebRequest request) {
    ValidationErrorDTO validationError = ValidationErrorDTO.builder()
        .fieldErrors(ex.getBindingResult().getFieldErrors().stream()
            .map(fieldError -> FieldErrorDTO.builder()
                .field(fieldError.getField())
                .message(messageSource.getMessage(fieldError, LocaleContextHolder.getLocale()))
                .build())
            .collect(Collectors.toList()))
        .build();
    LOGGER.debug("W3MnsZ validation error: {}", validationError);
    return new ResponseEntity<Object>(validationError, HttpStatus.BAD_REQUEST);
  }
}

====

@ToString
@Builder
public class ValidationErrorDTO {

  private final List<FieldErrorDTO> fieldErrors;
}

====

@ToString
@Builder
@Getter
@JsonInclude(Include.NON_NULL)
public class FieldErrorDTO {

  private final String field;
  private final String message;
}

我的ErrorHandler.handleMethodArgumentNotValid()被命中,但是返回給客戶端的實際響應主體不是來自我的ValidationErrorDTO

{
  "timestamp": 1523115887261,
  "status": 400,
  "error": "Bad Request",
  "exception": "org.springframework.web.bind.MethodArgumentNotValidException",
  "errors": [
    {
      "codes": [
        "NotEmpty.myDTO.field.another.lastly",
        "NotEmpty.field.another.lastly",
        "NotEmpty.lastly",
        "NotEmpty.java.lang.String",
        "NotEmpty"
      ],
      "arguments": [
        {
          "codes": [
            "myDTO.field.another.lastly",
            "field.another.lastly"
          ],
          "arguments": null,
          "defaultMessage": "field.another.lastly",
          "code": "field.another.lastly"
        }
      ],
      "defaultMessage": "may not be empty",
      "objectName": "myDTO",
      "field": "field.another.lastly",
      "rejectedValue": null,
      "bindingFailure": false,
      "code": "NotEmpty"
    }
  ],
  "message": "Validation failed for object='myDTO'. Error count: 1",
  "path": "/myPath"
}

我發現發生的事情是org.springframework.boot.autoconfigure.web.DefaultErrorAttributes受到打擊,並以某種方式覆蓋了我的自定義響應正文。

我該怎么做才能將自定義響應正文返回給客戶端?

只是想通了。

ValidationErrorDTO.fieldErrors沒有吸氣劑。

@ToString
@Builder
@Getter
public class ValidationErrorDTO {

  @Singular
  private final List<FieldErrorDTO> fieldErrors;
}

現在它起作用了,我們得到了回應:

{
  "fieldErrors": [
    {
      "field": "field.another.lastly",
      "message": "may not be empty"
    }
  ]
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM