@@ -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 }
0 commit comments