Skip to content

Commit 730207d

Browse files
committed
Code review updates
1 parent 3095be0 commit 730207d

File tree

2 files changed

+17
-9
lines changed

2 files changed

+17
-9
lines changed

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

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,15 @@ final class ConventionSetPrivateFieldImpl implements Convention {
2828
@Override
2929
public void apply(final ClassModelBuilder<?> classModelBuilder) {
3030
for (PropertyModelBuilder<?> propertyModelBuilder : classModelBuilder.getPropertyModelBuilders()) {
31-
if (propertyModelBuilder.getPropertyAccessor() instanceof PropertyAccessorImpl) {
32-
PropertyAccessorImpl<?> defaultAccessor = (PropertyAccessorImpl<?>) propertyModelBuilder.getPropertyAccessor();
33-
PropertyMetadata<?> propertyMetaData = defaultAccessor.getPropertyMetadata();
34-
if (!propertyMetaData.isDeserializable() && isPrivate(propertyMetaData.getField().getModifiers())) {
35-
setPropertyAccessor(propertyModelBuilder);
36-
}
31+
if (!(propertyModelBuilder.getPropertyAccessor() instanceof PropertyAccessorImpl)) {
32+
throw new CodecConfigurationException(format("The SET_PRIVATE_FIELDS_CONVENTION is not compatible with "
33+
+ "propertyModelBuilder instance that have custom implementations of org.bson.codecs.pojo.PropertyAccessor: %s",
34+
propertyModelBuilder.getPropertyAccessor().getClass().getName()));
35+
}
36+
PropertyAccessorImpl<?> defaultAccessor = (PropertyAccessorImpl<?>) propertyModelBuilder.getPropertyAccessor();
37+
PropertyMetadata<?> propertyMetaData = defaultAccessor.getPropertyMetadata();
38+
if (!propertyMetaData.isDeserializable() && isPrivate(propertyMetaData.getField().getModifiers())) {
39+
setPropertyAccessor(propertyModelBuilder);
3740
}
3841
}
3942
}
@@ -49,6 +52,12 @@ private static final class PrivateProperyAccessor<T> implements PropertyAccessor
4952

5053
private PrivateProperyAccessor(final PropertyAccessorImpl<T> wrapped) {
5154
this.wrapped = wrapped;
55+
try {
56+
wrapped.getPropertyMetadata().getField().setAccessible(true);
57+
} catch (Exception e) {
58+
throw new CodecConfigurationException(format("Unable to make private field accessible '%s' in %s",
59+
wrapped.getPropertyMetadata().getName(), wrapped.getPropertyMetadata().getDeclaringClassName()), e);
60+
}
5261
}
5362

5463
@Override
@@ -64,8 +73,7 @@ public <S> void set(final S instance, final T value) {
6473
field.set(instance, value);
6574
} catch (Exception e) {
6675
throw new CodecConfigurationException(format("Unable to set value for property '%s' in %s",
67-
wrapped.getPropertyMetadata().getName(),
68-
wrapped.getPropertyMetadata().getDeclaringClassName()), e);
76+
wrapped.getPropertyMetadata().getName(), wrapped.getPropertyMetadata().getDeclaringClassName()), e);
6977
}
7078
}
7179
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public final class Conventions {
5252
/**
5353
* A convention that enables private fields to be set using reflection.
5454
*
55-
* <p>This convention, mimics how some other JSON libraries directly set a private field when there is no setter.</p>
55+
* <p>This convention mimics how some other JSON libraries directly set a private field when there is no setter.</p>
5656
* <p>Note: This convention is not part of the {@code DEFAULT_CONVENTIONS} list and must explicitly be set.</p>
5757
*
5858
* @since 3.6

0 commit comments

Comments
 (0)