ConstraintValidator 的自定义消息

Saj*_*ran 8 java jax-rs hibernate-validator spring-boot

我正在使用下面给出的 ConstraintValidator 实现来验证 Spring Boot REST 服务的请求对象

@Target({ FIELD, METHOD, PARAMETER, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = MyRequestValidator.class)
@Documented
public @interface MyRequestValidation {

    String message() default "Mandatory fields missing";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

public class MyRequestValidator
            implements
                ConstraintValidator<MyRequestValidation, MyRequest>{
   @Override
    public void initialize(MyRequestValidation constraintAnnotation) {
        // Nothing to do here
    }
   @Override
    public boolean isValid(MyRequest myRequest, ConstraintValidatorContext context) {
 //do some validation
     context.disableDefaultConstraintViolation();    
     context.buildConstraintViolationWithTemplate("Id can contain only alphabets and digits")
    .addPropertyNode("id")
    .addConstraintViolation();
   }
}

//REST end point
public interface RestApi{
  @Produces(MediaType.XML)
  @Consumes(MediaType.XML)
  @POST
  MyResponse action(@MyRequestValidation MyRequest myRequest);
}

@Component
public class RestApiImpl implements RestApi {
..
}
Run Code Online (Sandbox Code Playgroud)

这产生输出为

[PARAMETER]
[myRequest.arg0.id]
[Id can contain only alphabets and digits]
Run Code Online (Sandbox Code Playgroud)

无论如何都可以生成 JSON 或 XML 消息(或基于 REST 端点上的 @Produces 注释)。我正在使用这些接口 ConstraintValidatorContext 的 Hibernate 实现

Jon*_*ohx 1

是的,您可以ConstraintViolationException通过实施捕获何时发生, custom error handler然后您也可以在您的响应和状态中添加任何内容。

ConstraintViolationException1.-抛出时更改状态的简单方法。

import javax.validation.ConstraintViolationException;

@ControllerAdvice
public class CustomErrorHandler {

    @ExceptionHandler(ConstraintViolationException.class)
    public void handleConstraintViolationException(ConstraintViolationException exception,
        ServletWebRequest webRequest) throws IOException {
        webRequest.getResponse().sendError(HttpStatus.BAD_REQUEST.value(), exception.getMessage());
    }
} 
Run Code Online (Sandbox Code Playgroud)

2.- 发生时放置响应的自定义方式ConstraintViolationException

@ControllerAdvice
public class CustomErrorHandler {

    @ExceptionHandler(ConstraintViolationException.class)
    public ResponseEntity<CustomError> handleConstraintViolationException(ConstraintViolationException exception) {
        CustomError customError = new CustomError();
        customError.setStatus(HttpStatus.BAD_REQUEST);
        customError.setMessage(exception.getMessage());
        customError.addConstraintErrors(exception.getConstraintViolations());
        return ResponseEntity.badRequest().body(customError);
    }
}   
Run Code Online (Sandbox Code Playgroud)