gpt4 book ai didi

java - Spring Boot ConstraintViolationException 适用于创建但不适用于更新

转载 作者:行者123 更新时间:2023-12-02 02:16:04 29 4
gpt4 key购买 nike

我在 Spring Boot 中有一个模型,在字段上有正则表达式约束

@Entity(name = "foo")
public class Foo {

//primary key id and other fields

@Pattern(regexp="^[0-9]{10}", message="length must be 10")
@Column(name = "mobile_number", nullable = false)
private String mobileNumber;

}

我还有一个异常处理程序

 @Order(Ordered.HIGHEST_PRECEDENCE)
@ControllerAdvice
public class RestExceptionHandler extends ResponseEntityExceptionHandler {

// other exception handlers

@ExceptionHandler(javax.validation.ConstraintViolationException.class)
protected ResponseEntity<Object> handleConstraintViolation(javax.validation.ConstraintViolationException ex) {
ApiError apiError = new ApiError(HttpStatus.BAD_REQUEST);
apiError.setMessage("Validation Error");
apiError.addValidationErrors(ex.getConstraintViolations());
return buildResponseEntity(apiError);
}
}

现在,当我使用不正确的手机号码模式创建 Foo 的新实例时,会引发 ConstraintViolationException 并收到消息验证错误。但是,当我尝试使用不正确的手机号码更新 Foo 的现有实例时,不会触发此异常。相反,我收到以下错误:

11:28:30.357 [http-nio-8080-exec-6] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Error while committing the transaction] with root cause
javax.validation.ConstraintViolationException: Validation failed for classes [com.example.app.model.Foo] during update time for groups [javax.validation.groups.Default, ]
List of constraint violations:[
ConstraintViolationImpl{interpolatedMessage='length must be 10', propertyPath=mobileNumber, rootBeanClass=class com.example.app.model.Foo, messageTemplate='length must be 10'}
]
at org.hibernate.cfg.beanvalidation.BeanValidationEventListener.validate(BeanValidationEventListener.java:140)
at org.hibernate.cfg.beanvalidation.BeanValidationEventListener.onPreUpdate(BeanValidationEventListener.java:88)
at org.hibernate.action.internal.EntityUpdateAction.preUpdate(EntityUpdateAction.java:248)
at org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:119)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:478)
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:356)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)
at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1454)
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:511)
at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3283)
at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2479)
at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:473)

为什么它在创建时有效但在更新时无效?我们是否需要添加一些配置来检查更新的约束违规情况?另外,如何显示消息“长度必须为 10”而不是“验证错误”?我似乎无法从 handleConstraintViolation 方法访问 @Pattern 中定义的消息。

最佳答案

尝试添加@Valid注解,在进入方法之前验证,只有实体的注解字段,在持久化时验证。

@Valid 在进入方法之前验证对象。

关于java - Spring Boot ConstraintViolationException 适用于创建但不适用于更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57302857/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com