Java 如何在ConstraintValidatorContext的标题属性错误响应中去掉propertyPath-SpringBoot自定义验证
我在SpringREST控制器中为请求实现了自定义验证注释,该注释验证输入请求正文中是否有字段2,那么字段1不应为空。我的问题是如何在错误响应中去掉字段UserInputDTO.UserInputDTO(在将其传递给ExceptionHandler之前) 注意:我需要这个,因为我不想在错误响应中暴露敏感数据(类名和实例名)。我对此进行了调试,并尝试从对象ConstraintValidatorContextImpl中删除默认路径或基本路径(从PathImpl中),但失败 错误响应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
{
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{
字符串消息()默认为“无效请求”;
类[]组()默认值{};
类您可以@OverridehandleMethodArgumentNotValid
并自定义错误响应正文
例如:
@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();