Customizing JAX-RS response when a ConstraintViolationException is thrown by Bean Validation

前端 未结 1 1413
北海茫月
北海茫月 2021-01-05 04:00

Bean Validation is a good option to validate objects, but how to customize the response of a REST API (using RESTeasy) when a ConstraintViolationException is th

相关标签:
1条回答
  • 2021-01-05 04:17

    With JAX-RS can define an ExceptionMapper to handle ConstraintViolationExceptions.

    From the ConstraintViolationException, you can get a set of ConstraintViolation, that exposes the constraint violation context, then map the details you need to an abitrary class and return in the response:

    @Provider
    public class ConstraintViolationExceptionMapper 
           implements ExceptionMapper<ConstraintViolationException> {
    
        @Override
        public Response toResponse(ConstraintViolationException exception) {
    
            List<ValidationError> errors = exception.getConstraintViolations().stream()
                    .map(this::toValidationError)
                    .collect(Collectors.toList());
    
            return Response.status(Response.Status.BAD_REQUEST).entity(errors)
                           .type(MediaType.APPLICATION_JSON).build();
        }
    
        private ValidationError toValidationError(ConstraintViolation constraintViolation) {
            ValidationError error = new ValidationError();
            error.setPath(constraintViolation.getPropertyPath().toString());
            error.setMessage(constraintViolation.getMessage());
            return error;
        }
    }
    
    public class ValidationError {
    
        private String path;
        private String message;
    
        // Getters and setters
    }
    

    If you use Jackson for JSON parsing, you may want to have a look at this answer, showing how to get the value of the actual JSON property.

    0 讨论(0)
提交回复
热议问题