Skip to content

Not possible to persist arrays containing null as first (or only) element #2215

@tamland

Description

@tamland

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 068c957

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions