![](/img/trans.png)
[英]Handling MethodArgumentNotValidException in Junit testcase?
[英]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.