我有一个使用自定义序列化器的注释:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@JacksonAnnotationsInside
@JsonSerialize(using = MaskingSerializer.class)
public @interface JsonMask {
}
和序列化器:
public class MaskingSerializer extends JsonSerializer<String> {
@Override
public void serialize(String value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeString(RegExUtils.replaceAll(value, ".", "*"));
}
}
我只希望序列化器在某些时候将
String
替换为 *
。我希望有一种方法可以为 ObjectMapper
提供上下文,然后序列化器就可以使用它。
我尝试过:
SerializationConfig serializationConfig = objectMapper.getSerializationConfig();
serializationConfig.getAttributes().withAttribute(MaskingSerializer.JSON_MASK_ENABLED_ATTRIBUTE, Boolean.TRUE);
return objectMapper
.setConfig(serializationConfig)
.valueToTree(entity);
}
在序列化器中:
if (serializerProvider.getConfig().getAttributes().getAttribute(JSON_MASK_ENABLED_ATTRIBUTE) == Boolean.TRUE) {
jsonGenerator.writeString(RegExUtils.replaceAll(value, ".", "*"));
} else {
jsonGenerator.writeString(value);
}
但是
getAttributes()
总是有一个空的ContextAttributes
。我也尝试过.withPerCallAttribute()
和.withSharedAttribute()
,但都没有成功。
有没有办法在序列化时通过
ObjectMapper
将上下文传递给序列化器?
在杰克逊社区的帮助下:
拨打
ObjectMapper
时:
return objectMapper
.writer()
.withAttribute(MaskingSerializer.JSON_MASK_ENABLED_ATTRIBUTE, Boolean.TRUE)
.writeValueAsString(entity);
在序列化器中:
if (serializerProvider.getAttribute(JSON_MASK_ENABLED_ATTRIBUTE) == Boolean.TRUE) {
jsonGenerator.writeString(RegExUtils.replaceAll(value, ".", "*"));
} else {
jsonGenerator.writeString(value);
}