简体   繁体   中英

How to send the same response body as "ResponseStatusException" in a custom "ResponseEntityExceptionHandler" in Spring?

When a MethodArgumentNotValidException is thrown in my Spring app I would like the response to:

  1. Have a 400 code
  2. Have a body similar to the one you get when you throw a ResponseStatusException in a regular controller

Here's my code for now:

@ControllerAdvice
public class CustomExceptionHandlers extends ResponseEntityExceptionHandler {
    @Override
    protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        FieldError err = ex.getBindingResult().getFieldErrors().get(0);
        String msg = "Unknown error";
        if (err != null) {
            msg = err.getField() + ": " + err.getDefaultMessage();
        }
        throw new ResponseStatusException(HttpStatus.BAD_REQUEST, msg);
    }
}

The problem is: it does nothing (I guess). I feel like I shouldn't throw an exception in a ResponseEntityExceptionHandler .

Any idea?

Edit: Apparently I want what DefaultErrorAttributes produces, but I still don't know how to use it.

@Order(Ordered.HIGHEST_PRECEDENCE)
@ControllerAdvice
public class CustomExceptionHandler {

    @ResponseStatus(BAD_REQUEST)
    @ResponseBody
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<Map<String, Object>> methodArgumentNotValidException(MethodArgumentNotValidException ex, WebRequest request) {
        // Make the message
        FieldError err = ex.getBindingResult().getFieldErrors().get(0);
        String msg = "Unknown error";
        if (err != null) {
            msg = err.getField() + ": " + err.getDefaultMessage();
        }

        // Set attributes
        request.setAttribute("javax.servlet.error.status_code", BAD_REQUEST.value(), WebRequest.SCOPE_REQUEST);
        request.setAttribute("javax.servlet.error.message", msg, WebRequest.SCOPE_REQUEST);

        // Return the error
        DefaultErrorAttributes errorAttributes = new DefaultErrorAttributes();
        return ResponseEntity.badRequest().body(errorAttributes.getErrorAttributes(request, false));
    }

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM