Skip to content

Commit 546ef89

Browse files
committed
Fix PojoCodec NPE with automatic mapping of Enums
JAVA-2709
1 parent e4851af commit 546ef89

File tree

4 files changed

+9
-7
lines changed

4 files changed

+9
-7
lines changed

bson/src/main/org/bson/codecs/pojo/PojoBuilderHelper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ static <T> void configureClassModelBuilder(final ClassModelBuilder<T> classModel
5555
TypeData<?> parentClassTypeData = null;
5656

5757
Map<String, PropertyMetadata<?>> propertyNameMap = new HashMap<String, PropertyMetadata<?>>();
58-
while (currentClass.getSuperclass() != null) {
58+
while (!currentClass.isEnum() && currentClass.getSuperclass() != null) {
5959
annotations.addAll(asList(currentClass.getDeclaredAnnotations()));
6060
List<String> genericTypeNames = new ArrayList<String>();
6161
for (TypeVariable<? extends Class<? super T>> classTypeVariable : currentClass.getTypeParameters()) {

bson/src/main/org/bson/codecs/pojo/PojoCodecImpl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,8 @@ private static <T> boolean shouldSpecialize(final ClassModel<T> classModel) {
334334

335335
for (Map.Entry<String, TypeParameterMap> entry : classModel.getPropertyNameToTypeParameterMap().entrySet()) {
336336
TypeParameterMap typeParameterMap = entry.getValue();
337-
if (typeParameterMap.hasTypeParameters() && classModel.getPropertyModel(entry.getKey()).getCodec() == null) {
337+
PropertyModel<?> propertyModel = classModel.getPropertyModel(entry.getKey());
338+
if (typeParameterMap.hasTypeParameters() && (propertyModel == null || propertyModel.getCodec() == null)) {
338339
return false;
339340
}
340341
}

bson/src/test/unit/org/bson/codecs/pojo/PojoCustomTest.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -250,11 +250,6 @@ public void testUseGettersForSettersConventionNotEmptyMap() {
250250
roundTrip(builder, new MapGetterNonEmptyModel(Collections.singletonMap("a", 3)), "{mapField: {a: 3}}");
251251
}
252252

253-
@Test
254-
public void testEnumSupport() {
255-
roundTrip(getPojoCodecProviderBuilder(SimpleEnumModel.class), new SimpleEnumModel(SimpleEnum.BRAVO), "{ 'myEnum': 'BRAVO' }");
256-
}
257-
258253
@Test
259254
public void testEnumSupportWithCustomCodec() {
260255
CodecRegistry registry = fromRegistries(getCodecRegistry(getPojoCodecProviderBuilder(SimpleEnumModel.class)),

bson/src/test/unit/org/bson/codecs/pojo/PojoRoundTripTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@
5555
import org.bson.codecs.pojo.entities.ShapeModelAbstract;
5656
import org.bson.codecs.pojo.entities.ShapeModelCircle;
5757
import org.bson.codecs.pojo.entities.ShapeModelRectangle;
58+
import org.bson.codecs.pojo.entities.SimpleEnum;
59+
import org.bson.codecs.pojo.entities.SimpleEnumModel;
5860
import org.bson.codecs.pojo.entities.SimpleGenericsModel;
5961
import org.bson.codecs.pojo.entities.SimpleModel;
6062
import org.bson.codecs.pojo.entities.SimpleNestedPojoModel;
@@ -351,6 +353,10 @@ private static List<TestData> testCases() {
351353
getPojoCodecProviderBuilder(FieldAndPropertyTypeMismatchModel.class),
352354
"{'stringField': 'foo'}"));
353355

356+
data.add(new TestData("Enums support",
357+
new SimpleEnumModel(SimpleEnum.BRAVO),
358+
getPojoCodecProviderBuilder(SimpleEnumModel.class),
359+
"{ 'myEnum': 'BRAVO' }"));
354360
return data;
355361
}
356362

0 commit comments

Comments
 (0)