Skip to content

Commit d86ab67

Browse files
authored
Merge pull request #26 from jhorstmann/nested-object-with-jpa-annotations
Fix NullPointerException in ObjectFieldMapper.mapFromDbObjectNode
2 parents b134be3 + 5834714 commit d86ab67

File tree

5 files changed

+73
-5
lines changed

5 files changed

+73
-5
lines changed

src/main/java/de/zalando/typemapper/core/DatabaseFieldDescriptor.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import de.zalando.typemapper.annotations.DatabaseField;
66
import de.zalando.typemapper.core.fieldMapper.AnyTransformer;
7+
import de.zalando.typemapper.core.fieldMapper.DefaultObjectMapper;
78
import de.zalando.typemapper.core.fieldMapper.ObjectMapper;
89

910
public class DatabaseFieldDescriptor {
@@ -23,6 +24,7 @@ public DatabaseFieldDescriptor(final Column column) {
2324
this.name = column.name();
2425
this.position = -1;
2526
this.transformer = AnyTransformer.class;
27+
this.mapper = DefaultObjectMapper.class;
2628
}
2729

2830
public String getName() {

src/main/java/de/zalando/typemapper/core/fieldMapper/ObjectFieldMapper.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package de.zalando.typemapper.core.fieldMapper;
22

3+
import static de.zalando.typemapper.postgres.PgTypeHelper.getDatabaseFieldDescriptor;
4+
35
import java.lang.reflect.InvocationTargetException;
46

57
import java.util.List;
68

79
import org.slf4j.Logger;
810
import org.slf4j.LoggerFactory;
911

10-
import de.zalando.typemapper.annotations.DatabaseField;
12+
import de.zalando.typemapper.core.DatabaseFieldDescriptor;
1113
import de.zalando.typemapper.core.Mapping;
1214
import de.zalando.typemapper.core.result.ArrayResultNode;
1315
import de.zalando.typemapper.core.result.DbResultNode;
@@ -34,13 +36,13 @@ private static boolean isRowWithAllFieldsNull(final ObjectResultNode node) {
3436
public static final Object mapFromDbObjectNode(final Class classz, final ObjectResultNode node,
3537
final Mapping mapping) throws InstantiationException, IllegalAccessException, IllegalArgumentException,
3638
InvocationTargetException, NotsupportedTypeException {
37-
DatabaseField databaseField = mapping.getField().getAnnotation(DatabaseField.class);
39+
final DatabaseFieldDescriptor descriptor = getDatabaseFieldDescriptor(mapping.getField());
3840
final Object value;
3941

4042
if (mapping.isOptionalField() && isRowWithAllFieldsNull(node)) {
4143
value = null;
42-
} else if (databaseField.mapper() != DefaultObjectMapper.class) {
43-
ObjectMapper mapper = databaseField.mapper().newInstance();
44+
} else if (descriptor.getMapper() != DefaultObjectMapper.class) {
45+
ObjectMapper mapper = descriptor.getMapper().newInstance();
4446
value = mapper.unmarshalFromDbNode(node);
4547
} else {
4648
value = mapField(mapping.getFieldClass(), node);

src/test/java/de/zalando/typemapper/namedresult/ColumnTestIT.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,46 @@
1515
import de.zalando.typemapper.core.TypeMapper;
1616
import de.zalando.typemapper.core.TypeMapperFactory;
1717
import de.zalando.typemapper.namedresult.results.ClassWithColumnDefinition;
18+
import de.zalando.typemapper.namedresult.results.ClassWithColumnDefinitionWithObject;
1819

1920
@RunWith(SpringJUnit4ClassRunner.class)
2021
public class ColumnTestIT extends AbstractTest {
2122

2223
@Test
2324
public void testColumnMappings() throws SQLException {
24-
final PreparedStatement ps = connection.prepareStatement("SELECT 2 as l, 'c' as c");
25+
final PreparedStatement ps = connection.prepareStatement("SELECT 1 as i, 2 as l, 'c' as c");
2526
final ResultSet rs = ps.executeQuery();
2627
final TypeMapper<?> mapper = TypeMapperFactory.createTypeMapper(ClassWithColumnDefinition.class);
2728
int i = 0;
2829
while (rs.next()) {
2930
final ClassWithColumnDefinition result = (ClassWithColumnDefinition) mapper.mapRow(rs, i++);
3031
Assert.assertNotNull(result);
32+
Assert.assertEquals(1, result.getI());
3133
Assert.assertEquals(2, result.getL());
3234
Assert.assertEquals('c', result.getC());
3335
}
3436
}
37+
38+
@Test
39+
public void testNestedColumnMappings() throws SQLException {
40+
final PreparedStatement ps = connection.prepareStatement(
41+
"SELECT 'test' AS name, ROW(1, 2, 'c')::tmp.simple_type AS nested");
42+
final ResultSet rs = ps.executeQuery();
43+
final TypeMapper<?> mapper = TypeMapperFactory.createTypeMapper(ClassWithColumnDefinitionWithObject.class);
44+
int i = 0;
45+
while (rs.next()) {
46+
final ClassWithColumnDefinitionWithObject result = (ClassWithColumnDefinitionWithObject) mapper.mapRow(rs,
47+
i++);
48+
Assert.assertNotNull(result);
49+
Assert.assertEquals("test", result.getName());
50+
51+
final ClassWithColumnDefinition nested = result.getNested();
52+
Assert.assertNotNull(nested);
53+
54+
Assert.assertEquals(1, nested.getI());
55+
Assert.assertEquals(2, nested.getL());
56+
Assert.assertEquals('c', nested.getC());
57+
}
58+
}
59+
3560
}

src/test/java/de/zalando/typemapper/namedresult/results/ClassWithColumnDefinition.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,23 @@
44

55
public class ClassWithColumnDefinition {
66

7+
@Column(name = "i")
8+
public int i;
9+
710
@Column(name = "l")
811
public long l;
912

1013
@Column
1114
public char c;
1215

16+
public int getI() {
17+
return i;
18+
}
19+
20+
public void setI(final int i) {
21+
this.i = i;
22+
}
23+
1324
public long getL() {
1425
return l;
1526
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package de.zalando.typemapper.namedresult.results;
2+
3+
import javax.persistence.Column;
4+
5+
public class ClassWithColumnDefinitionWithObject {
6+
7+
@Column(name = "name")
8+
public String name;
9+
10+
@Column(name = "nested")
11+
public ClassWithColumnDefinition nested;
12+
13+
public String getName() {
14+
return name;
15+
}
16+
17+
public void setName(final String name) {
18+
this.name = name;
19+
}
20+
21+
public ClassWithColumnDefinition getNested() {
22+
return nested;
23+
}
24+
25+
public void setNested(final ClassWithColumnDefinition nested) {
26+
this.nested = nested;
27+
}
28+
}

0 commit comments

Comments
 (0)