【发布时间】:2019-01-08 06:24:44
【问题描述】:
我写了一个自定义序列化器和自定义反序列化器来序列化带有@Confidential 注解的属性。
@Data
public class Person {
private String name;
@Confidential
private String address;
}
Custom Serializer 使用以下值序列化 POJO:
{ "name": "John Doe", "address": "Kearney St"}
如下:
{"name":"John Doe", "address": {"value":"IjIwMzEwIDU4dGggTG4gTkUi"}}
Custom Deserializer 还能够将 JSON 反序列化回 Person POJO。
但是,当我将 Person POJO 中的字段设置为最终字段时,序列化继续工作,但反序列化失败。
@Data
public class Person {
private final String name;
@Confidential
private final String address;
}
这是 BeanSerializerModifier 的实现:
@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;
}
}
我发现 CustomDeserializer 在 Person POJO 字段为 final 时永远不会被调用。
这是错误信息:
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"])
Jackson 专家能否告诉我为什么我的 CustomDeserializer 在 POJO 字段为最终字段时没有被调用。
谢谢!
【问题讨论】:
-
只是一个快速的猜测:问题可能是由于缺少默认构造函数。您可以尝试将
@NoArgsConstructor添加到Person吗? -
对不起,这不是一个选项,Jan。我们不能使类可变。所有字段都必须是最终字段。
-
这不是解决方案建议,只是让您更清楚问题所在的步骤。
-
如果您使用 Lombok >= 1.16.20,您也可以尝试将
lombok.anyConstructor.addConstructorProperties = true添加到您的 lombok.config。 -
没有杰克逊专家回答 2 年前提出的问题?我面临同样的问题,很想知道这个问题是否有解决方案?通过使用 bean 修饰符或其他方式。无论有没有龙目岛,问题都是一样的。任何帮助或反馈都非常受欢迎。
标签: java json jackson annotations lombok