Частичная отправка формы весной

В моем приложении 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

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

M. Deinum 21.01.2019 08:11

@M.Deinum M.Deinum да, BindingResult должен непосредственно следовать за атрибутом модели, на самом деле это была опечатка. Но дело в том, как мне добиться частичной отправки формы? Я думал, что буду использовать два контроллера, один для сохранения черновика и один для окончательной отправки. В окончательном контроллере представления я бы использовал Valid.

John 21.01.2019 09:34

Пожалуйста, прочитайте мой комментарий. Как уже упоминалось, ошибка возникает не из-за веб-проверки, а из-за уровня сохраняемости, который автоматически интегрируется с проверкой Bean.

M. Deinum 21.01.2019 14:06

@М. Deinum Я прочитал ваш комментарий и понял его. Мой вопрос в том, как мне решить эту проблему? Я уже объяснил, что пробовал.

John 22.01.2019 15:24

Как указано, проблема заключается в сохранении объекта, НЕ получающего отправку формы. Поэтому попытка решить это на веб-слое, очевидно, не поможет. Я не уверен, что вы можете отключить проверку объекта при сохранении только в определенном варианте использования.

M. Deinum 22.01.2019 15:29
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
186
0

Другие вопросы по теме