gpt4 book ai didi

java - 如何使用 Spring $$EnhancerBySpringCGLIB$$ 捕获异常?

转载 作者:行者123 更新时间:2023-11-30 02:39:33 26 4
gpt4 key购买 nike

我和this有同样的问题人。我得到了堆栈跟踪,因为我放置了一条违反唯一字段绑定(bind)的新记录:

Exception in thread "main" org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
at org.springframework.orm.hibernate5.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:241)
at org.springframework.orm.hibernate5.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:755)
at org.springframework.orm.hibernate5.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:594)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:761)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:730)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:504)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:292)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:656)
at sistema.database.manager.BookManager$$EnhancerBySpringCGLIB$$d46d6805.create(<generated>)
at tests.unatantum.migration.InactiveBookMigration.migrate(InactiveBookMigration.java:53)
at tests.unatantum.migration.InactiveBookMigration.main(InactiveBookMigration.java:42)

当我(在管理器中)调用此方法时,它有一个通用变量 T 并且 @Transactional 被放入整个类中,而不是每个单个方法中:

public void create(T value) {
try{
System.out.println(value);
getDao().create(value);
System.out.println("good");
} catch (DataIntegrityViolationException dive){
throw new SistemaRuntimeException(dive.getMessage() + ": " + value);
}
}

System.out.println 只是出于调试原因。 重点是我希望能够直接在管理器中捕获该异常。但在堆栈跟踪中,似乎只有未知类起作用。如何捕获管理器内的异常(如果可能,使用相同的方法)?
当它在调用所示方法(位于同一管理器中)的方法末尾提交时,它似乎会抛出异常。我真的需要在调用 dao 之前进行检查吗?这不会让我浪费时间,而我应该能够等待异常吗?

最佳答案

我认为该行为与事务拦截器有关。如果您将 @Transactional 放在类上,Spring 会创建一个动态代理(管理器的子类),基本上调用看起来像这样:


创建(t)
-> proxy.handle(methodCall)
-> 开放交易
-> 调用真正的方法(你的 manager.create(..),catch block 所在的位置)
-> 提交事务(这是异常发生的地方)
-> 从 proxy.create(t) 返回结果

所以 BookManager$$EnhancerBySpringCGLIB$$d46d6805 是一个子类,它在方法调用之前和之后添加行为。捕获发生在您的方法调用内。并且异常发生在提交时。因此,异常发生在代理内,在您的捕获之外。如果您想捕获该异常,则需要确保在离开 catch block 之前提交事务(例如,通过使 dao.create(..) 在其自己的事务中执行)。

关于java - 如何使用 Spring $$EnhancerBySpringCGLIB$$ 捕获异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42138365/

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