Java 如何在ConstraintValidatorContext的标题属性错误响应中去掉propertyPath-SpringBoot自定义验证

Java 如何在ConstraintValidatorContext的标题属性错误响应中去掉propertyPath-SpringBoot自定义验证,java,spring-boot,validation,bean-validation,Java,Spring Boot,Validation,Bean Validation,我在SpringREST控制器中为请求实现了自定义验证注释,该注释验证输入请求正文中是否有字段2,那么字段1不应为空。我的问题是如何在错误响应中去掉字段UserInputDTO.UserInputDTO(在将其传递给ExceptionHandler之前) 注意:我需要这个,因为我不想在错误响应中暴露敏感数据(类名和实例名)。我对此进行了调试,并尝试从对象ConstraintValidatorContextImpl中删除默认路径或基本路径(从PathImpl中),但失败 错误响应 { status

我在SpringREST控制器中为请求实现了自定义验证注释,该注释验证输入请求正文中是否有字段2,那么字段1不应为空。我的问题是如何在错误响应中去掉字段UserInputDTO.UserInputDTO(在将其传递给ExceptionHandler之前)

注意:我需要这个,因为我不想在错误响应中暴露敏感数据(类名和实例名)。我对此进行了调试,并尝试从对象ConstraintValidatorContextImpl中删除默认路径或基本路径(从PathImpl中),但失败

错误响应

{
status : 400
title : Bad Request: Field 'UserInputDTO.userInputDTO' : field1 should not be empty if Field2 is present
}
注释类

@Documented
@Constraint(validatedBy = UserInputValidator.class)
@Target( { ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface UserInputConstraint {
    String message() default "Invalid request";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
public class UserInputValidator implements
  ConstraintValidator<UserInputConstraint, UserInputDTO> {

    @Override
    public void initialize(UserInputConstraint userInputConstraint) {
    }

    @Override
    public boolean isValid(UserInputDTO userInputDTO,
      ConstraintValidatorContext cxt) {
        boolean isValid=true;
        String errorMessage = null;
        if (userInputDTO.field2 != null && userInputDTO.field1 == null) {
               isValid = false;
              context.buildConstraintViolationWithTemplate("field1 should not be empty if Field2 is presen").addConstraintViolation();
    }
       return isValid;
}
@已记录
@约束(validatedBy=UserInputValidator.class)
@目标({ElementType.METHOD,ElementType.FIELD})
@保留(RetentionPolicy.RUNTIME)
public@interface UserInputConstraint{
字符串消息()默认为“无效请求”;
类[]组()默认值{};

类您可以@Override
handleMethodArgumentNotValid
并自定义错误响应正文

例如:

@RestControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {

  @Override
  public ResponseEntity<Object> handleMethodArgumentNotValid(
      MethodArgumentNotValidException exception, HttpHeaders headers, HttpStatus status,
      WebRequest request) {   
    List<Object> errors = new ArrayList<Object>();
    for (FieldError fielderror : exception.getBindingResult().getFieldErrors()) {
      Map<String, Object> error = new HashMap<>();
      error.put("code", fielderror.getCode());
      error.put("message", fielderror.getDefaultMessage());
      errors.add(error);
    }
    return new ResponseEntity<>(errors, apiError.getStatus());
  }
} 

您是否在异常处理程序中处理
ConstraintViolationExecution
?是的,但它正由我们项目的核心框架库处理。因此,我必须在处理异常之前将其清除。我发现这一点非常简单,并应用了相同的方法。您可以覆盖异常处理程序,有关详细信息,请参阅我的答案
context.disableDefaultConstraintViolation();