Expected behavior
Log contains message current transaction is aborted, commands ignored until end of transaction block
.
Actual behavior
Log contains NullPointerException
.
Steps to reproduce the problem
- Execute any invalid sql in jooq that throws exception so that current transaction gets aborted.
- Execute again an sql in jooq and notice the NPE instead of root exception message
My exception is:
org.postgresql.util.PSQLException: ERROR: current transaction is aborted, commands ignored until end of transaction block
that fails to be translated (https://github.com/spring-projects/spring-framework/blob/f7678cdcdda14e1575f435ad424af31451934c10/spring-jdbc/src/main/java/org/springframework/jdbc/support/SQLErrorCodeSQLExceptionTranslator.java#L177 returns null).
then context handles the null
exception:
https://github.com/spring-projects/spring-boot/blob/28ddb7fe65f4ef5b116b1f7fba5e114131195e31/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jooq/JooqExceptionTranslator.java#L81-L83
and fails with NullPointerException
at https://github.com/jOOQ/jOOQ/blob/bc5b3a4c2505cb118c5399a17c00b7ef55b38ece/jOOQ/src/main/java/org/jooq/impl/DefaultExecuteContext.java#L675
Result exception:
java.lang.NullPointerException
at org.jooq.impl.DefaultExecuteContext.exception(DefaultExecuteContext.java:735)
at org.springframework.boot.autoconfigure.jooq.JooqExceptionTranslator.handle(JooqExceptionTranslator.java:83)
at org.springframework.boot.autoconfigure.jooq.JooqExceptionTranslator.exception(JooqExceptionTranslator.java:55)
at org.jooq.impl.ExecuteListeners.exception(ExecuteListeners.java:274)
at org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:386)
at org.jooq.impl.DefaultDSLContext.execute(DefaultDSLContext.java:1139)
at pse.util.db.postgres.ConnectionTimeoutAspect.aroundContainer(ConnectionTimeoutAspect.java:51)
at pse.util.db.postgres.ConnectionTimeoutAspectTest.abortedTransaction_aroundBody20(ConnectionTimeoutAspectTest.java:88)
at pse.util.db.postgres.ConnectionTimeoutAspectTest$AjcClosure21.run(ConnectionTimeoutAspectTest.java:1)
at org.springframework.transaction.aspectj.AbstractTransactionAspect.ajc$around$org_springframework_transaction_aspectj_AbstractTransactionAspect$1$2a73e96cproceed(AbstractTransactionAspect.aj:67)
at org.springframework.transaction.aspectj.AbstractTransactionAspect$AbstractTransactionAspect$1.proceedWithInvocation(AbstractTransactionAspect.aj:73)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388)
at org.springframework.transaction.aspectj.AbstractTransactionAspect.ajc$around$org_springframework_transaction_aspectj_AbstractTransactionAspect$1$2a73e96c(AbstractTransactionAspect.aj:71)
at pse.util.db.postgres.ConnectionTimeoutAspectTest.abortedTransaction(ConnectionTimeoutAspectTest.java:88)
at pse.util.db.postgres.ConnectionTimeoutAspectTest.testTransactionAborted_aroundBody24(ConnectionTimeoutAspectTest.java:101)
at pse.util.db.postgres.ConnectionTimeoutAspectTest$AjcClosure25.run(ConnectionTimeoutAspectTest.java:1)
at org.springframework.transaction.aspectj.AbstractTransactionAspect.ajc$around$org_springframework_transaction_aspectj_AbstractTransactionAspect$1$2a73e96cproceed(AbstractTransactionAspect.aj:67)
at org.springframework.transaction.aspectj.AbstractTransactionAspect$AbstractTransactionAspect$1.proceedWithInvocation(AbstractTransactionAspect.aj:73)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388)
at org.springframework.transaction.aspectj.AbstractTransactionAspect.ajc$around$org_springframework_transaction_aspectj_AbstractTransactionAspect$1$2a73e96c(AbstractTransactionAspect.aj:71)
at pse.util.db.postgres.ConnectionTimeoutAspectTest.testTransactionAborted(ConnectionTimeoutAspectTest.java:101)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:132)
at org.testng.internal.MethodInvocationHelper$1.runTestMethod(MethodInvocationHelper.java:238)
at org.springframework.test.context.testng.AbstractTestNGSpringContextTests.run(AbstractTestNGSpringContextTests.java:184)
at org.testng.internal.MethodInvocationHelper.invokeHookable(MethodInvocationHelper.java:252)
at org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:595)
at org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:174)
at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46)
at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:822)
at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:147)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
at org.testng.TestRunner.privateRun(TestRunner.java:764)
at org.testng.TestRunner.run(TestRunner.java:585)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:384)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:378)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:337)
at org.testng.SuiteRunner.run(SuiteRunner.java:286)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1218)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1140)
at org.testng.TestNG.runSuites(TestNG.java:1069)
at org.testng.TestNG.run(TestNG.java:1037)
Comment From: cdalexndr
Seems to be fixed in https://github.com/jOOQ/jOOQ/commit/d3c1229d4d0e9451eb8427aa2af9cd663cc38c7a
Comment From: cdalexndr
Actually, only NPE is fixed, but it will show Unspecified SQLException
due to null
translated exception, and logs need to include the root cause.
Exception should be translated to not be ignored.
Comment From: wilkinsona
Thanks for the suggestion but we don't think we should do this. Please see https://github.com/spring-projects/spring-boot/pull/25493#issuecomment-790717219 for details.
/cc @lukaseder
Comment From: lukaseder
Thanks for the ping. I've commented on the other issue: https://github.com/spring-projects/spring-boot/pull/25493#issuecomment-800973221