TransactionSystemException Vs ConstraintViolationException
Bonjour à tous,
J'ai un petit problème que je ne comprend pas, et pour lequel j'aurais bien aimé un peu d'aide.
Pour commencer, j'ai un test :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
@SpringApplicationContext("test-applicationContext.xml")
@DataSet
public class MonServiceTest extends UnitilsJUnit4 {
@SpringBeanByName
private MonService monService;
@Test(expected = ConstraintViolationException.class)
public void testCreateVide() {
final MonBean beanVide = new MonBean();
monService.createBean(beanVide);
}
... |
Ce test appelle donc un service (passe plat ici) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
|
@Service
public class MonService {
@Autowired
private MonDao monDao;
public void createBean(MonBean bean) {
monDao.createBean(bean);
}
... |
Et donc le DAO, très simple lui aussi :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
@Repository
public class MonDao {
@PersistenceContext
private EntityManager entityManager;
@Transactional
public void createBean(MonBean bean) {
entityManager.persist(bean);
}
... |
Le test est conçu pour échouer (d'où le expected) puisque j'utilise un bean vide. Les contraintes sur les champs du bean font que ça doit planter.
Plus concrètement, si je met un log dans le DAO, comme suit :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
@Transactional
public void createSite(Site newSite) {
try {
entityManager.persist(newSite);
} catch (RuntimeException e) {
System.out.println("***DAO***"+e.getClass());
logger.error(e.getMessage(), e);
throw e;
}
} |
J'obtiens bien la trace suivante :
Code:
1 2 3 4 5 6 7 8
|
***DAO***class javax.validation.ConstraintViolationException
ERROR: com.moi.MonDao - Validation failed for classes [com.moi.MonBean] during persist time for groups [javax.validation.groups.Default, ]
List of constraint violations:[
ConstraintViolationImpl{interpolatedMessage='ne peut pas être vide', propertyPath=name, rootBeanClass=class com.moi.MonBean, messageTemplate='{org.hibernate.validator.constraints.NotBlank.message}'}
ConstraintViolationImpl{interpolatedMessage='Au moins une langue doit être sélectionnées', propertyPath=langs, rootBeanClass=class com.moi.MonBean, messageTemplate='{com.moi.monbean.checklangs}'}
ConstraintViolationImpl{interpolatedMessage='ne peut pas être vide', propertyPath=visualId, rootBeanClass=class com.moi.MonBean, messageTemplate='{org.hibernate.validator.constraints.NotBlank.message}'}
] |
J'obtiens bien une trace équivalente quand j'ajoute des logs dans le service.
Par contre, mon test JUnit (lancé depuis Eclipse) est rouge. J'ai une TransactionSystemException alors que je devrais avoir une ConstraintViolationException. Et je ne comprend pas comment/pourquoi la TransactionSystemException arrive...
J'ai la trace suivante dans JUnit :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly
at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:521)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
at org.unitils.database.transaction.impl.DefaultUnitilsTransactionManager.commit(DefaultUnitilsTransactionManager.java:137)
at org.unitils.database.DatabaseModule.commitTransaction(DatabaseModule.java:421)
at org.unitils.database.DatabaseModule.endTransactionForTestMethod(DatabaseModule.java:396)
at org.unitils.database.DatabaseModule$DatabaseTestListener.afterTestTearDown(DatabaseModule.java:540)
at org.unitils.core.Unitils$UnitilsTestListener.afterTestTearDown(Unitils.java:315)
at org.unitils.UnitilsJUnit4TestClassRunner$TestListenerInvokingMethodRoadie.runBeforesThenTestThenAfters(UnitilsJUnit4TestClassRunner.java:159)
at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:84)
at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49)
at org.unitils.UnitilsJUnit4TestClassRunner.invokeTestMethod(UnitilsJUnit4TestClassRunner.java:95)
at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:61)
at org.unitils.UnitilsJUnit4TestClassRunner.access$000(UnitilsJUnit4TestClassRunner.java:44)
at org.unitils.UnitilsJUnit4TestClassRunner$1.run(UnitilsJUnit4TestClassRunner.java:62)
at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
at org.unitils.UnitilsJUnit4TestClassRunner.run(UnitilsJUnit4TestClassRunner.java:68)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: javax.persistence.RollbackException: Transaction marked as rollbackOnly
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:73)
at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:512)
... 23 more |
Si quelqu'un pouvait m’éclairer.
Merci d'avance.