Java Validation NotBlank注解修饰Date类型报错

在Spring项目中遇到使用@NotBlank注解校验Date类型参数时,抛出UnexpectedTypeException,提示找不到合适的校验器。尝试更换为@NotEmpty和@NotNull注解同样报错,问题在于@NotBlank不适用于非CharSequence类型。解决方案是避免对Date类型使用这些注解,考虑使用@NotNull或其他适合的验证方式。

报错详情

2021-04-02 14:13:44.191 [http-nio-8103-exec-4] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint ‘javax.validation.constraints.NotBlank’ validating type ‘java.util.Date’. Check configuration for ‘activityStartTime’] with root cause
javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint ‘javax.validation.constraints.NotBlank’ validating type ‘java.util.Date’. Check configuration for ‘activityStartTime’
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.getExceptionForNullValidator(ConstraintTree.java:108)
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.getInitializedConstraintValidator(ConstraintTree.java:140)
at org.hibernate.validator.internal.engine.constraintvalidation.SimpleConstraintTree.validateConstraints(SimpleConstraintTree.java:55)
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:73)
at org.hibernate.validator.internal.metadata.core.MetaConstraint.doValidateConstraint(MetaConstraint.java:127)
at org.hibernate.validator.internal.metadata.core.MetaConstraint.validateConstraint(MetaConstraint.java:120)
at org.hibernate.validator.internal.engine.ValidatorImpl.validateMetaConstraint(ValidatorImpl.java:552)
at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForSingleDefaultGroupElement(ValidatorImpl.java:515)
at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForDefaultGroup(ValidatorImpl.java:485)
at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:447)
at org.hibernate.validator.internal.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:397)
at org.hibernate.validator.internal.engine.ValidatorImpl.validate(ValidatorImpl.java:173)

Controller接参代码

@PostMapping("/add")
	@ApiOperation(value = "添加活动信息")
	public Result<ActivityVo> activityAdd(@RequestBody @Valid ActivityDTO activityDTO) throws UnsupportedEncodingException {
		return activityService.activityAdd(activityDTO);
	}

接参实体类

package com.qingke.studytour.manager.entity.dto;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.NotBlank;
import java.math.BigDecimal;
import java.util.Date;

/**
 * @author Even
 * @Title:
 * @Package
 * @Description:
 * @date 2021/3/22 10:41
 */
@Data
public class ActivityDTO {
	@ApiModelProperty(value = "大活动Id")
	private Long activityId;
	@ApiModelProperty(value = "子活动Id")
	private Long id;
	@ApiModelProperty(value = "活动名称")
	@NotBlank(message = "活动名称不能为空")
	private String activityName;
	@NotBlank(message = "活动开始时间不能为空")
	@ApiModelProperty(value = "活动开始时间")
	private Date activityStartTime;
	@NotBlank(message = "活动结束时间不能为空")
	@ApiModelProperty(value = "活动结束时间")
	private Date activityEndTime;
	@NotBlank(message = "报名开始时间不能为空")
	@ApiModelProperty(value = "报名开始时间")
	private Date applyStartTime;
	@NotBlank(message = "报名结束时间不能为空")
	@ApiModelProperty(value = "报名结束时间")
	private Date applyEndTime;
	@NotBlank(message = "报名费不能为空")
	@ApiModelProperty(value = "报名费")
	private BigDecimal applyAmount;
	@NotBlank(message = "学校不能为空")
	@ApiModelProperty(value = "学校ID")
	private Long schoolId;
	@ApiModelProperty(value = "学校名称")
	private String schoolName;
	@NotBlank(message = "负责人不能为空")
	@ApiModelProperty(value = "负责人Id")
	private Long activityPrincipalId;
	@ApiModelProperty(value = "负责人姓名")
	private String activityPrincipalName;
	@NotBlank(message = "分享标题不能为空")
	@ApiModelProperty(value = "分享标题")
	private String shareTitle;
	@NotBlank(message = "分享图片不能为空")
	@ApiModelProperty(value = "分享图片")
	private String  shareImgs;
	@NotBlank(message = "活动图片不能为空")
	@ApiModelProperty(value = "活动图片")
	private String activityImgs;
	@ApiModelProperty(value = "活动行程描述")
	private String activityRemark;


}

关键报错
No validator could be found for constraint ‘javax.validation.constraints.NotBlank’ validating type ‘java.util.Date’. Check configuration for ‘activityStartTime’] with root cause
javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint ‘javax.validation.constraints.NotBlank’ validating type ‘java.util.Date’. Check configuration for ‘activityStartTime’
尝试使用javax.validation.constraints.NotEmpty注解
2021-04-02 14:21:54.880 [http-nio-8103-exec-5] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint ‘javax.validation.constraints.NotEmpty’ validating type ‘java.util.Date’. Check configuration for ‘activityStartTime’] with root cause
javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint ‘javax.validation.constraints.NotEmpty’ validating type ‘java.util.Date’. Check configuration for ‘activityStartTime’
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.getExceptionForNullValidator(ConstraintTree.java:108)
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.getInitializedConstraintValidator(ConstraintTree.java:140)
at org.hibernate.validator.internal.engine.constraintvalidation.SimpleConstraintTree.validateConstraints(SimpleConstraintTree.java:55)
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:73)
at org.hibernate.validator.internal.metadata.core.MetaConstraint.doValidateConstraint(MetaConstraint.java:127)
at org.hibernate.validator.internal.metadata.core.MetaConstraint.validateConstraint(MetaConstraint.java:120)
at org.hibernate.validator.internal.engine.ValidatorImpl.validateMetaConstraint(ValidatorImpl.java:552)
at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForSingleDefaultGroupElement(ValidatorImpl.java:515)
at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForDefaultGroup(ValidatorImpl.java:485)
at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:447)
at org.hibernate.validator.internal.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:397)
at org.hibernate.validator.internal.engine.ValidatorImpl.validate(ValidatorImpl.java:173)
使用javax.validation.constraints.NotNull注解日期类型
[] threw exception [Request processing failed; nested exception is javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint ‘javax.validation.constraints.NotBlank’ validating type ‘java.math.BigDecimal’. Check configuration for ‘applyAmount’] with root cause
javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint ‘javax.validation.constraints.NotBlank’ validating type ‘java.math.BigDecimal’. Check configuration for ‘applyAmount’
No validator could be found for constraint ‘javax.validation.constraints.NotBlank’ validating type ‘java.lang.Long’. Check configuration for ‘schoolId’] with root cause
javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint ‘javax.validation.constraints.NotBlank’ validating type ‘java.lang.Long’. Check configuration for ‘schoolId’
No validator could be found for constraint ‘javax.validation.constraints.NotBlank’ validating type ‘java.lang.Long’. Check configuration for ‘activityPrincipalId’] with root cause

@NotBlank注解源码

可以看到该注解支持校验类型CharSequence类型的实体对象

The annotated element must not be {@code null} and must contain at least one

  • non-whitespace character. Accepts {@code CharSequence}.
Java 后端中,使用切面赋值后仍被 `@NotBlank` 注解拦截报错,可能由多种原因导致,以下是一些可行的解决方案: ### 检查切面执行顺序 要保证切面在 `@NotBlank` 注解验证之前执行。可借助 `@Order` 注解来指定切面的执行顺序,数值越小,执行越早。 ```java import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Aspect; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; @Aspect @Component @Order(1) // 确保此切面在验证之前执行 public class YourAspect { @Before("execution(* com.yourpackage.YourController.yourMethod(..))") public void beforeAdvice() { // 进行赋值操作 } } ``` ### 手动触发验证 在切面赋值之后,手动触发验证,而非依赖框架自动验证。可以使用 `javax.validation.Validator` 来手动验证对象。 ```java import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory; import java.util.Set; public class ValidationUtil { public static <T> boolean validate(T object) { ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); Set<ConstraintViolation<T>> violations = validator.validate(object); return violations.isEmpty(); } } ``` 在切面赋值后调用该方法进行验证: ```java YourObject yourObject = new YourObject(); // 切面赋值操作 boolean isValid = ValidationUtil.validate(yourObject); if (!isValid) { // 处理验证不通过的情况 } ``` ### 检查注解生效条件 要确保 `@NotBlank` 注解所在的类被正确扫描和处理。通常,需要在配置类上添加 `@Validated` 注解,以开启验证功能。 ```java import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.RestController; @RestController @Validated public class YourController { // 控制器方法 } ``` ### 检查对象引用 要保证切面中操作的对象与被验证的对象是同一个引用。如果在切面中创建了新的对象并赋值,而验证的是原来的对象,就会出现赋值后仍验证不通过的问题。 ### 调试切面逻辑 可以在切面中添加日志,确认赋值操作是否真正执行,以及赋值的内容是否符合预期。 ```java import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @Aspect @Component public class YourAspect { private static final Logger logger = LoggerFactory.getLogger(YourAspect.class); @Before("execution(* com.yourpackage.YourController.yourMethod(..))") public void beforeAdvice() { // 进行赋值操作 logger.info("赋值操作执行,赋值内容:xxx"); } } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值