diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/conversion/Neo4jOgmEntityInstantiatorAdapter.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/conversion/Neo4jOgmEntityInstantiatorAdapter.java index 5e5bfff57..a3919b4ba 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/conversion/Neo4jOgmEntityInstantiatorAdapter.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/conversion/Neo4jOgmEntityInstantiatorAdapter.java @@ -20,6 +20,7 @@ import java.util.Collections; import java.util.Map; import org.neo4j.ogm.metadata.reflect.EntityAccessManager; +import org.neo4j.ogm.session.Utils; import org.springframework.core.convert.ConversionService; import org.springframework.data.convert.EntityInstantiator; import org.springframework.data.mapping.PreferredConstructor; @@ -109,7 +110,8 @@ public class Neo4jOgmEntityInstantiatorAdapter implements org.neo4j.ogm.session. ? EntityAccessManager.merge(collectionType, value, new Object[] {}, elementType) : EntityAccessManager.merge(collectionType, value, Collections.EMPTY_LIST, elementType); } - return value; + + return Utils.coerceTypes(parameter.getType().getType(), value); } } } diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/conversion/Neo4jOgmEntityInstantiatorAdapterTests.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/conversion/Neo4jOgmEntityInstantiatorAdapterTests.java index ac96e1617..de839105b 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/conversion/Neo4jOgmEntityInstantiatorAdapterTests.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/conversion/Neo4jOgmEntityInstantiatorAdapterTests.java @@ -34,6 +34,7 @@ import org.neo4j.graphdb.Node; import org.neo4j.harness.ServerControls; import org.neo4j.harness.TestServerBuilders; import org.neo4j.ogm.drivers.bolt.driver.BoltDriver; +import org.neo4j.ogm.session.Session; import org.neo4j.ogm.session.SessionFactory; import org.neo4j.procedure.Context; import org.neo4j.procedure.Name; @@ -42,6 +43,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import org.springframework.data.neo4j.conversion.ogm618.CoercedNumericInCtor; import org.springframework.data.neo4j.conversion.ogm618.MyNode; import org.springframework.data.neo4j.conversion.ogm618.MyNodeRepository; import org.springframework.data.neo4j.conversion.ogm618.ResultHolder; @@ -69,13 +71,28 @@ public class Neo4jOgmEntityInstantiatorAdapterTests { serverControls = TestServerBuilders.newInProcessBuilder() .withProcedure(Neo4jOgmEntityInstantiatorAdapterTests.ListReturningThing.class) - .withFixture("CREATE (m:MyNode{name: 'All the', things: []})").newServer(); + .withFixture("CREATE (m:MyNode{name: 'All the', things: []})") + .withFixture("CREATE (m:CoercedNumericInCtor{name: 'Whatever', lfdnr: 4711})") + .newServer(); boltURI = serverControls.boltURI(); } @Autowired private MyNodeRepository myNodeRepository; + @Autowired + private Session session; + + @Test // GH-1712 + public void longVsIntMustNotRelyOnConverter() { + + Optional optionalNode = session.loadAll(CoercedNumericInCtor.class).stream().findFirst(); + assertThat(optionalNode).hasValueSatisfying(object -> { + assertThat(object.getLfdnr()).isEqualTo(4711); + assertThat(object.getName()).isEqualTo("Whatever"); + }); + } + @Test public void ctorShouldHandleEmptyArrayFromAttributes() { diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/conversion/ogm618/CoercedNumericInCtor.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/conversion/ogm618/CoercedNumericInCtor.java new file mode 100644 index 000000000..193f71e61 --- /dev/null +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/conversion/ogm618/CoercedNumericInCtor.java @@ -0,0 +1,51 @@ +/* + * Copyright 2011-2021 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.neo4j.conversion.ogm618; + +import org.neo4j.ogm.annotation.GeneratedValue; +import org.neo4j.ogm.annotation.Id; +import org.neo4j.ogm.annotation.NodeEntity; + +/** + * @author Michael J. Simons + */ +@NodeEntity +public class CoercedNumericInCtor { + + @Id @GeneratedValue + private Long id; + + private String name; + + private Integer lfdnr; + + public CoercedNumericInCtor(String name, Integer lfdnr) { + this.name = name; + this.lfdnr = lfdnr; + } + + public Long getId() { + return id; + } + + public String getName() { + return name; + } + + public Integer getLfdnr() { + return lfdnr; + } +}