Jackson's BeanDeserializerModifier does not work with final fields

强颜欢笑 提交于 2019-12-11 07:21:31

问题


I wrote a Custom Serializer and Custom Deserializer to serialize properties marked with @Confidential annotation.

@Data
public class Person {
   private String name;

   @Confidential
   private String address;
}

The Custom Serializer serializes a POJO with following values:

{ "name": "John Doe", "address": "Kearney St"}

as follows:

{"name":"John Doe", "address": {"value":"IjIwMzEwIDU4dGggTG4gTkUi"}}

The Custom Deserializer is also able to deserialize the JSON back to the Person POJO fine.

However, when I make the fields in the Person POJO final, serialization continues to work, but deserialization fails.

@Data
public class Person {
    private final String name;

    @Confidential
    private final String address;
 }

Here's the BeanSerializerModifier implementation:

@AllArgsConstructor
public class CustomDeserializerModifier extends BeanDeserializerModifier {
    private final ObjectMapper objectMapper;

    @Override
    public BeanDeserializerBuilder updateBuilder(final DeserializationConfig config,
                                                 final BeanDescription beanDesc,
                                                 final BeanDeserializerBuilder builder) {
        Iterator<SettableBeanProperty> beanPropertyIterator = builder.getProperties();
        beanPropertyIterator.forEachRemaining(settableBeanProperty -> {
            final Confidential annotation = settableBeanProperty.getAnnotation(Confidential.class);
            if (encryptedProperty != null) {
                JsonDeserializer<Object> current = settableBeanProperty.getValueDeserializer();
                final SettableBeanProperty newSettableBeanProperty =
                        settableBeanProperty.withValueDeserializer(
                                new CustomDeserializer(annotation, current, objectMapper)
                        );
                builder.addOrReplaceProperty(newSettableBeanProperty, true);
            }
        });

        return builder;
    }
}

I found that CustomDeserializer, never gets called when the Person POJO fields are final.

Here's the error message:

com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of START_OBJECT token
 at [Source: {"name":"John Doe","address":{"value":"IjIwMzEwIDU4dGggTG4gTkUi"}}; line: 1, column: 30] (through reference chain: com.custom.model.Person["address"])

Can a Jackson expert please tell me why my CustomDeserializer isn't getting invoked when the POJO fields are final.

Thank you!

来源:https://stackoverflow.com/questions/54086246/jacksons-beandeserializermodifier-does-not-work-with-final-fields

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!