Spring自定义ConstraintValidator错误消息自动追加propertyPath的问题
解决自定义校验错误消息带属性路径前缀的问题
针对你遇到的自定义ConstraintValidator校验后错误消息被追加upload.DocumentMetaDataApplicationRequest :前缀的问题,提供以下几种可行方案:
方案1:全局异常处理器中提取纯错误消息
捕获MethodArgumentNotValidException异常,直接提取错误的defaultMessage字段,舍弃自动添加的前缀部分:
@RestControllerAdvice public class GlobalValidationExceptionHandler { @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity<List<String>> handleValidationErrors(MethodArgumentNotValidException ex) { List<String> errorMessages = ex.getBindingResult() .getAllErrors() .stream() .map(ObjectError::getDefaultMessage) .collect(Collectors.toList()); return new ResponseEntity<>(errorMessages, HttpStatus.BAD_REQUEST); } }
方案2:自定义消息插值器去除前缀
通过自定义MessageInterpolator覆盖默认逻辑,让校验框架直接返回你定义的原始错误消息:
1. 实现自定义消息插值器
@Component public class NoPrefixMessageInterpolator extends DefaultMessageInterpolator { @Override public String interpolate(String messageTemplate, Context context) { // 直接返回原始消息模板,不附加属性路径等前缀内容 return messageTemplate; } }
2. 配置自定义插值器到校验器
@Configuration public class ValidationConfig { @Bean public Validator validator(NoPrefixMessageInterpolator interpolator) { LocalValidatorFactoryBean validatorFactory = new LocalValidatorFactoryBean(); validatorFactory.setMessageInterpolator(interpolator); return validatorFactory; } }
方案3:自定义校验注解时指定纯消息
确保你的自定义校验注解DocumentMetaDataValidator的message属性直接设置为目标字符串,避免使用占位符导致框架自动拼接前缀:
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = DocumentMetaDataValidation.class) public @interface DocumentMetaDataValidator { String message() default "Duplicate document type present"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
内容的提问来源于stack exchange,提问作者MoonPie
相关产品推荐
相关产品推荐

