spring-projects / spring-projects/spring-data-relational
Not possible to persist arrays containing null as first (or only) element
Open
@schauder is already working on this.
Since Jul 1, 2026.
status: waiting-for-triage
- Dominant language
- Java
- Stars
- 827
- Forks
- 394
- PR merge metrics
- No merged PRs in 30d
Description
In older versions of spring-data-relational it was possible to map collections of simple types containing null to a db array column. But this no longer works when the first element is null. If any element except for the first is null, it works as expected. Specifically, this example:
data class Entity(
@Id
val id: UUID,
val column: List<String?>, // text[] db column type
)
val entity = Entity(UUID.randomUUID(), listOf(null))
aggregateTemplate.insert(entity)
throws the following error:
Cannot invoke "Object.getClass()" because the return value of "java.util.List.get(int)" is null
java.lang.NullPointerException: Cannot invoke "Object.getClass()" because the return value of "java.util.List.get(int)" is null
at org.springframework.data.relational.core.conversion.MappingRelationalConverter.writeCollection(MappingRelationalConverter.java:817)
at org.springframework.data.relational.core.conversion.MappingRelationalConverter.getPotentiallyConvertedSimpleWrite(MappingRelationalConverter.java:743)
at org.springframework.data.jdbc.core.convert.MappingJdbcConverter.getPotentiallyConvertedSimpleWrite(MappingJdbcConverter.java:256)
at org.springframework.data.relational.core.conversion.MappingRelationalConverter.writeValue(MappingRelationalConverter.java:721)
at org.springframework.data.jdbc.core.convert.MappingJdbcConverter.writeJdbcValue(MappingJdbcConverter.java:294)
at org.springframework.data.jdbc.core.convert.JdbcConverter.writeJdbcValue(JdbcConverter.java:50)
at org.springframework.data.jdbc.core.convert.SqlParametersFactory.addConvertedValue(SqlParametersFactory.java:244)
at org.springframework.data.jdbc.core.convert.SqlParametersFactory.addConvertedPropertyValue(SqlParametersFactory.java:231)
at org.springframework.data.jdbc.core.convert.SqlParametersFactory.lambda$getParameterSource$0(SqlParametersFactory.java:293)
at org.springframework.data.mapping.model.BasicPersistentEntity.doWithProperties(BasicPersistentEntity.java:325)
at org.springframework.data.mapping.PersistentEntity.doWithAll(PersistentEntity.java:270)
at org.springframework.data.jdbc.core.convert.SqlParametersFactory.getParameterSource(SqlParametersFactory.java:270)
at org.springframework.data.jdbc.core.convert.SqlParametersFactory.forInsert(SqlParametersFactory.java:86)
at org.springframework.data.jdbc.core.convert.DefaultDataAccessStrategy.insert(DefaultDataAccessStrategy.java:124)
at org.springframework.data.jdbc.core.JdbcAggregateChangeExecutionContext.executeInsertRoot(JdbcAggregateChangeExecutionContext.java:82)
at org.springframework.data.jdbc.core.AggregateChangeExecutor.execute(AggregateChangeExecutor.java:83)
at org.springframework.data.jdbc.core.AggregateChangeExecutor.lambda$executeSave$0(AggregateChangeExecutor.java:60)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
at org.springframework.data.relational.core.conversion.SaveBatchingAggregateChange.forEachAction(SaveBatchingAggregateChange.java:68)
at org.springframework.data.jdbc.core.AggregateChangeExecutor.executeSave(AggregateChangeExecutor.java:60)
at org.springframework.data.jdbc.core.JdbcAggregateTemplate.performSave(JdbcAggregateTemplate.java:590)
at org.springframework.data.jdbc.core.JdbcAggregateTemplate.insert(JdbcAggregateTemplate.java:239)
This does not throw any error:
val entity = Entity(UUID.randomUUID(), listOf("a", null))
aggregateTemplate.insert(entity)
This issue appears to have been introduced by https://github.com/spring-projects/spring-data-relational/commit/068c957b140de26b09281de5a87915c703f1d0fd
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.