Skip to content

Commit ff5861c

Browse files
committed
Handle nulls returned from async tx functions
Previously code failed with NPE when provided async transaction function returned null. This commit fixes the problem by wrapping null in a completed future.
1 parent c0fff4c commit ff5861c

File tree

3 files changed

+24
-1
lines changed

3 files changed

+24
-1
lines changed

driver/src/main/java/org/neo4j/driver/internal/NetworkSession.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,10 @@ private <T> CompletionStage<T> safeExecuteWork( ExplicitTransaction tx, Transact
360360
// sync failure will result in an exception being thrown
361361
try
362362
{
363-
return work.execute( tx );
363+
CompletionStage<T> result = work.execute( tx );
364+
365+
// protect from given transaction function returning null
366+
return result == null ? completedFuture( null ) : result;
364367
}
365368
catch ( Throwable workError )
366369
{

driver/src/test/java/org/neo4j/driver/v1/integration/SessionAsyncIT.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1157,6 +1157,16 @@ public void shouldAllowAccessingRecordsAfterSessionClosed()
11571157
}
11581158
}
11591159

1160+
@Test
1161+
public void shouldAllowReturningNullFromAsyncTransactionFunction()
1162+
{
1163+
CompletionStage<Object> readResult = session.readTransactionAsync( tx -> null );
1164+
assertNull( await( readResult ) );
1165+
1166+
CompletionStage<Object> writeResult = session.writeTransactionAsync( tx -> null );
1167+
assertNull( await( writeResult ) );
1168+
}
1169+
11601170
private Future<List<CompletionStage<Record>>> runNestedQueries( StatementResultCursor inputCursor )
11611171
{
11621172
CompletableFuture<List<CompletionStage<Record>>> resultFuture = new CompletableFuture<>();

driver/src/test/java/org/neo4j/driver/v1/integration/SessionIT.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1486,6 +1486,16 @@ public void shouldBeResponsiveToThreadInterruptWhenWaitingForResult() throws Exc
14861486
}
14871487
}
14881488

1489+
@Test
1490+
public void shouldAllowReturningNullFromTransactionFunction()
1491+
{
1492+
try ( Session session = neo4j.driver().session() )
1493+
{
1494+
assertNull( session.readTransaction( tx -> null ) );
1495+
assertNull( session.writeTransaction( tx -> null ) );
1496+
}
1497+
}
1498+
14891499
private void assumeServerIs31OrLater()
14901500
{
14911501
ServerVersion serverVersion = ServerVersion.version( neo4j.driver() );

0 commit comments

Comments
 (0)