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

  1. Execute any invalid sql in jooq that throws exception so that current transaction gets aborted.
  2. 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