Невозможно поймать TransactionSystemException - PullRequest
0 голосов
/ 11 июня 2018

У меня есть класс Entity Person, который связан с другим объектом Address через JoinColumn и имеет отношение OneToOne с Person, у объекта Address есть аннотация @NotNull для страны поля.

Упрощенный код приведен ниже:

@Entity
public class Person {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long PersonId; 

@Valid
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
@JoinColumn(name = "address_id")
private Address address;
....
..some more fields, getters and setters etc..
...
}

Объект Address находится ниже:

@Entity
public class Address {

@Id
@GeneratedValue
private Long addressId;

private String street;

@NotEmpty(message = "Country should be there")
private String country;

....some more fields and getters and setters etc ....
}

Кроме этого, у меня есть PersonRepository.

У меня также есть метод обслуживания, т.е. updateAddress, самая простая формаМетод ниже:

public class Service {

@Transactional
public void updateAddress(Long personId, Address address) {
try {
Person original = findPersonById(personId);

...some validations etc ....

original.setAddress(address);            
personRepository.save(original);
} catch (ConstraintViolationException e) {

    }
}

Я написал один небольшой модульный тест, в котором я пытаюсь обновить адрес, используя метод updateAddress для человека, у которого нет предопределенного адреса.

т.е.

@Test
void checkUpdateAddress() {
Person person = new Person();
.....initiate some fields, except address ....
Long personId =personRepository.save(person);

Address address = new Address();
address.street("abcd");

service.updatePerson(personId, address);
//assertions etc
}

Проблема в том, что я получаю

Причина: javax.validation.ConstraintViolationException: Проверка не удалась для классов [com.foor.bar.Address] в течение времени сохранения для групп [javax.validation.groups.Default,] Список нарушений ограничений: [ConstraintViolationImpl {interpolatedMessage = 'Страна должна быть там', propertyPath = страна, rootBeanClass = класс com.foo.bar.Address,messageTemplate = 'Страна должна быть там'}

org.springframework.transaction.TransactionSystemException: Не удалось зафиксировать транзакцию JPA;Вложенное исключение - javax.persistence.RollbackException: Ошибка при фиксации транзакции

Я пытался использовать блок try / catch, но все еще не смог перехватить это исключение.

Примечание: я упростил коды до минимальной степени, если есть что-то, что я забыл или если моя проблема неясна, тогда спросите.

РЕДАКТИРОВАНИЕ:

Полный стек

ОШИБКА ExceptionMapperStandardImpl: 39 - HHH000346: Ошибка во время управляемого сброса [Проверка не выполнена для классов [com.foo.bar.Address] в течение продолжительного времени для групп [javax.validation.groups.Default,] Список нарушений ограничений: [ConstraintViolationImpl {interpolatedMessage = 'Страна должна быть там', propertyPath = country, rootBeanClass = класс com.foo.bar.Address, messageTemplate ='Страна должна быть там'}]]

org.springframework.transaction.TransactionSystemException: Не удалось зафиксировать транзакцию JPA;вложенное исключение - javax.persistence.RollbackException: ошибка при фиксации транзакции

в org.springframework.orm.jpa.JpaTransactionManager.doCommit (JpaTransactionManager.java:545) в org.springframework.transaction.ManPlat.Amport.form.processCommit (AbstractPlatformTransactionManager.java:746) по адресу org.springframework.transaction.support.AbstractPlatformTransactionManager.commit (AbstractPlatformTransactionManager.java:714) по адресу org.springframework.transaction.interceptor.Transport.interforSpect.RuPlayPlayer.RuPlayer.RuPlayer.RuPlayer.RuPlay_Amp_Rate_Player.RuPlay_Amp_Rate_PlaySigner.exe.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction (TransactionAspectSupport.java:304) в org.springframework.transaction.interceptor.: 185) в org.springframework.aop.framework.CglibAopProxy $ DynamicAdvisedInterceptor.intercept (CglibAopProxy.java:689) в com.foo.bar.service.Service $$ EnhancerBySpringCGLIB $$ 57d9106c.updateAddress () в com.rfoo.bar.service.MyTest.ho56 (MyDest.chep)) на солнцеМетод115) вorg.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda $ invokeTestMethod $ 6 (TestMethodTestDescriptor.java:170) в org.junit.jupiter.engine.execution.ThrowableCollector.exavajolt или orgit).engine.descriptor.(TestMethodTestDescriptor.java:58) по адресу org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor $ NodeExecutor.lambda $ executeRecursively $ 3 (HierarchicalTestExecutor.java:112.form.pp.executeSafely (SingleTestExecutor.java:66) в org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor $ NodeExecutor.executeRecursively (HierarchicalTestExecutor.java:108) в org.junit.psupport.hir.erarchicalTestExecutor $ NodeExecutor.execute (HierarchicalTestExecutor.java:79) в org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor $ NodeExecutor.lambda $ executeRecursively $ 2 (HierarchicaljavaOE.ExE.ExEx1$ OfRef.accept (ForEachOps.java:184) на java.util.stream.ReferencePipeline $ 2 $ 1.accept (ReferencePipeline.java:175) на java.util.Iterator.forEachRemaining (Iterator.java:116) на java.util.Spliterators $ IteratorSpliterator.forEachRemaining (Spliterators.java:1801) в java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) в java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipelinetil.java ::47.stream.ForEachOps $ ForEachOp.evaluateSequential (ForEachOps.java:151) в java.util.stream.ForEachOps $ ForEachOp $ OfRef.evaluateSequential (ForEachOps.java:174) в java.util.stream.AbstractPlinee: 234) в java.util.stream.ReferencePipeline.forEach (ReferencePipeline.java:418) в орг..junit.platform.engine.support.hierarchical.HierarchicalTestExecutor $ NodeExecutor.lambda $ executeRecursively $ 3 (HierarchicalTestExecutor.java:120) в org.junit.platform.engine.support.hierarchical.SingleTecExecaorg.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor $ NodeExecutor.executeRecursively (HierarchicalTestExecutor.java:108) в org.junit.platform.engine.support.hierarchical.HierarchicalTecExececutor (Hec.org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor $ NodeExecutor.lambda $ executeRecursively $ 2 (HierarchicalTestExecutor.java:120) в java.util.stream.ForEachOps $ ForEachOp $ OfRef.psjj ().util.stream.ReferencePipeline $ 2 $ 1.accept (ReferencePipeline.java:175) в java.util.Iterator.forEachRemaining (Iterator.java:116) в java.util.Spliterators $ IteratorSpliterator.forEachRemaining (Spliterators.java:1801 в)java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) в java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) в java.util.stream.ForEachOps $ ForEachOp.evaluateSequential (ForEachOpstil.java.15.java:15)..stream.ForEachOps $ ForEachOp $ OfRef.evaluateSequential (ForEachOps.java:174) в java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) в java.util.stream.ReferencePipeline.forEach (ReferencePipeline.java:) в org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor $ NodeExecutor.lambda $ executeRecursively $ 3 (HierarchicalTestExecutor.java:120) в org.junit.platform.engine.estpport.hierarchicalExex.ExSecutor66) вorg.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor $ NodeExecutor.executeRecursively (HierarchicalTestExecutor.java:108) в org.junit.platform.engine.support.hierarchical.HierarchicalTecExececutor (Hec.org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute (HierarchicalTestExecutor.java:55) по адресу org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute (Hierarchicaljjj.jj:platform.launcher.core.DefaultLauncher.execute (DefaultLauncher.java:170) в org.junit.platform.launcher.core.DefaultLauncher.execute (DefaultLauncher.java:154) в org.junit.platform.launcher.core.Default.выполнить (DefaultLauncher.java:90) по адресу com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs (JUnit5IdeaTestRunner.java:74) по адресу com.intellij.rt.execution.junit.IdeaTestRunnerRunner.Runner.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart (JUnitStarter.java:242) в com.intellij.rt.execution.junit.JUnitStarter.main (JUnitStarter.java:70) Вызвано: javax.persistence.RollbackException: ошибка при фиксации транзакции в orgternal.hiber.ExceptionConverterImpl.convertCommitException (ExceptionConverterImpl.java:77) в org.hibernate.engine.transaction.internal.TransactionImpl.commit (TransactionImpl.java:71) в org.springframework.orm.jpa.JpaTransactionMmitagerManager) ... еще 63 Причины: javax.validation.ConstraintViolationException: проверка не удалась для классов [com.foo.bar.Address] в течение времени сохранения для групп [javax.validation.groups.Default,] Список нарушений ограничений: [ConstraintViolationImpl{interpolatedMessage = 'Страна должна быть там', propertyPath = TransactionsId, rootBeanClass = класс com.foo.bar.Address, messageTemplate = 'Страна должна быть там'}] в org.hibernate.cfg.beanvalidation.BeanValidationEventListener.validate (BeanValidationEventistener.java:140) в org.hibernate.cfg.beanvalidation.BeanValidationEventListener.onPreInsert (BeanValidationEventListener.java:80) в org.hibernate.action.internal.EntityInsertAction.preInsert (EntityInsertAhiber.j..internal.EntityInsertAction.execute (EntityInsertAction.java:82) в org.hibernate.engine.spi.ActionQueue.executeActions (ActionQueue.java:600) в org.hibernate.engine.spi.ActionQueue.executeActions (ActionQue4j..SessionImpl.java:1436) в org.hibernate.internal.SessionImpl.managedFlush (SessionImpl.java:493) в org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion (SessionImpl.java:3206) в org.Impl.(SessionImpl.java: 2412) at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion (JdbcCoordinatorImpl.java:473) по адресу org.hibernate.resource.transaction.backend.jdbackToв org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access $ 100 (JdbcResourceLocalTransactionCoordinatorImpl.java:38) в org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl $ TransactionDriverControlImpl.commit (JdbcResourceLocalTransactionCoordinatorImpl.java: 231) at org.hibernate.engine.transaction.internal.TransactionImpl.commit (TransactionImpl.java:68) ... еще 64

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Причина, по которой ConstraintViolationException не перехватывается, заключается в том, что хранилище не выдает это исключение, оно выдает TransactionSystemException, у которого есть вложенный ConstraintViolationException экземпляр.

См. thisвопрос для получения дополнительной информации о перехвате вложенных исключений.

0 голосов
/ 11 июня 2018

Попробуйте поймать PersistenceException.Это исключение является упакованным и не генерируется напрямую.Вы можете извлечь упакованный ConstraintViolationException, используя метод getCause().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...