Hello,
I'm using SDN 6.2.0-SNAPSHOT
I have an NPE when persisting a projection when the entity class has primitive fields.
My projection class has not defined the primitive fields.
Everything works fine when I change the primitive (boolean) by its wrapper Object (Boolean).
When I persist the data, I get a:
java.lang.NullPointerException
at java.base/sun.invoke.util.ValueConversions.unboxBoolean(ValueConversions.java:108)
at com.example.sdn6.entity.NoeudMaquetteEntity_Accessor_dh80lb.setProperty(Unknown Source)
at org.springframework.data.mapping.model.InstantiationAwarePropertyAccessor.setProperty(InstantiationAwarePropertyAccessor.java:104)
at org.springframework.data.neo4j.core.mapping.EntityFromDtoInstantiatingConverter.lambda$convert$0(EntityFromDtoInstantiatingConverter.java:94)
at org.springframework.data.mapping.model.BasicPersistentEntity.doWithProperties(BasicPersistentEntity.java:374)
at org.springframework.data.neo4j.core.mapping.EntityFromDtoInstantiatingConverter.convert(EntityFromDtoInstantiatingConverter.java:87)
at org.springframework.data.neo4j.core.Neo4jTemplate.doSave(Neo4jTemplate.java:942)
The issue can be reproduced by cloning GitHub - gonzalad/sdn6-tests, branch projection-persistence-lost-relations and execute
sdn6-tests/Sdn6Test.java at projection-persistence-lost-relations · gonzalad/sdn6-tests · GitHub
To reproduce, execute the testcase com.example.sdn6.Sdn6Test#testProjection
Should I create an issue on github ?
Thanks !
Entity class:
@Node("ObjetMaquette")
public class NoeudMaquetteEntity {
@GeneratedValue
@Id
private Long id;
private UUID idDefinition;
private String code;
private boolean readOnly;
Projection class:
public class NoeudProjection {
private Long id;
private UUID idDefinition;
private String code;
Code used for saving the projection:
@Override
public NoeudProjection save(NoeudProjection projection) {
return neo4jTemplate.save(NoeudMaquetteEntity.class).one(projection);
}
Testcase:
@Test
void testProjection() {
NoeudMaquetteEntity om = newEntity("F1");
om.setReadOnly(true);
repository.save(om);
// use projection for persistence
Optional<NoeudProjection> projectionAModifier = repository.findProjectionByIdDefinition(om.getIdDefinition());
assertThat(projectionAModifier).isNotEmpty();
assertThat(projectionAModifier.get().getCode()).isEqualTo("F1");
projectionAModifier.get().setCode("modifie");
repository.save(projectionAModifier.get());
Optional<NoeudMaquetteEntity> omRead = repository.findByIdDefinition(om.getIdDefinition());
assertThat(omRead).isPresent();
// check attribute updated by projection
assertThat(omRead.get().getCode()).isEqualTo("modifie");
// check attribute was not updated since it's not part of the projection
assertThat(omRead.get().isReadOnly()).isEqualTo(true);
}
private NoeudMaquetteEntity newEntity(String code) {
NoeudMaquetteEntity entity = new NoeudMaquetteEntity();
entity.setIdDefinition(UUID.randomUUID());
entity.setCode(code);
return entity;
}