Skip to content

JOOQ: Missing exception message when transaction is aborted #25689

@cdalexndr

Description

@cdalexndr

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:

DataAccessException translated = translate(context, translator, exception);
if (exception.getNextException() == null) {
context.exception(translated);

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)

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions