В моем приложении Spring я должен предоставить функцию «Сохранить как черновик». Но я не могу частично отправить форму из-за правил проверки объекта. Я хочу проверить форму только при нажатии кнопки «Сохранить финал», а не при нажатии кнопки «Сохранить черновик». Я попытался удалить аннотацию @Valid, но все еще получаю ошибку javax.validation.ConstraintViolationException.
Контроллер:
@PostMapping("/saveSalesDetails")
public String saveSales(Sales sales, @RequestParam("action") String formAction, BindingResult result, Model model) {
if (formAction.equalsIgnoreCase("Save Draft")) {
}
else if (formAction.equalsIgnoreCase("Save Final") {
}
Вот трассировка стека:
Caused by: javax.validation.ConstraintViolationException: Validation failed for classes [mip.salesproj.model.Sales] during persist time for groups [javax.validation.groups.Default, ]
List of constraint violations:[
ConstraintViolationImpl{interpolatedMessage='Target Of Sale should be between 5-20 characters', propertyPath=targetSale, rootBeanClass=class mip.salesproj.model.Sales, messageTemplate='Target Of Sale should be between 5-20 characters'}
ConstraintViolationImpl{interpolatedMessage='Target Of Sale field should not be blank', propertyPath=targetSale, rootBeanClass=class mip.salesproj.model.Sales, messageTemplate='Target Of Sale field should not be blank'}
]
at org.hibernate.cfg.beanvalidation.BeanValidationEventListener.validate(BeanValidationEventListener.java:140)
at org.hibernate.cfg.beanvalidation.BeanValidationEventListener.onPreInsert(BeanValidationEventListener.java:80)
at org.hibernate.action.internal.EntityInsertAction.preInsert(EntityInsertAction.java:205)
at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:82)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:600)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:474)
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:337)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)
at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1437)
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:494)
at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3245)
at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2451)
at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:473)
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:156)
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$100(JdbcResourceLocalTransactionCoordinatorImpl.java:38)
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:231)
at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:68)
... 107 common frames omitted
@M.Deinum M.Deinum да, BindingResult должен непосредственно следовать за атрибутом модели, на самом деле это была опечатка. Но дело в том, как мне добиться частичной отправки формы? Я думал, что буду использовать два контроллера, один для сохранения черновика и один для окончательной отправки. В окончательном контроллере представления я бы использовал Valid.
Пожалуйста, прочитайте мой комментарий. Как уже упоминалось, ошибка возникает не из-за веб-проверки, а из-за уровня сохраняемости, который автоматически интегрируется с проверкой Bean.
@М. Deinum Я прочитал ваш комментарий и понял его. Мой вопрос в том, как мне решить эту проблему? Я уже объяснил, что пробовал.
Как указано, проблема заключается в сохранении объекта, НЕ получающего отправку формы. Поэтому попытка решить это на веб-слое, очевидно, не поможет. Я не уверен, что вы можете отключить проверку объекта при сохранении только в определенном варианте использования.




Если бы вы прочитали трассировку стека, вы бы увидели, что проверка исходит не от веб-слоя, а от его сохранения. Валидация интегрируется с JPA (или, скорее, с режимом гибернации) напрямую, чтобы вы не хранили недопустимые сущности. Поэтому вам нужно будет отключить его и для JPA (хотя вы действительно хотите это сделать?). Также ваш контроллер неверен,
BindingResultДОЛЖЕН непосредственно следовать за атрибутом модели (в данном случаеSales), иначе он не будет работать.