Jackson:通过 ObjectMapper 将上下文传递给自定义序列化器

问题描述 投票:0回答:1

我有一个使用自定义序列化器的注释:

@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
将上下文传递给序列化器?

jackson
1个回答
0
投票

在杰克逊社区的帮助下:

拨打

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.