异常响应意外被掩码处理的原因排查
问题原因与解决方案
问题根源
你当前的配置把MaskingSerializer注册成了全局String类型序列化器,这意味着Jackson在序列化任何String对象时都会使用这个序列化器——包括Spring Boot默认异常响应(比如DefaultErrorAttributes生成的error、message、path等字段),所以这些不该被掩码的内容也被处理了。
你添加的@Masked注解实际上没有起到过滤作用:一方面全局序列化器的优先级高于字段级的@JsonSerialize,另一方面你也没有编写逻辑让序列化器仅对标记了@Masked的字段生效。
修复方案
需要调整配置,让MaskingSerializer只对标记了@Masked注解的字段生效,步骤如下:
- 自定义BeanSerializerModifier,动态为带注解的字段分配序列化器:
public class MaskingBeanSerializerModifier extends BeanSerializerModifier { @Override public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc, List<BeanPropertyWriter> beanProperties) { for (BeanPropertyWriter writer : beanProperties) { // 检查字段是否标记了@Masked注解 if (writer.getAnnotation(Masked.class) != null) { writer.assignSerializer(new MaskingSerializer()); } } return beanProperties; } }
- 更新Jackson配置,注册上述Modifier而非全局String序列化器:
// JacksonConfig @Bean public Jackson2ObjectMapperBuilderCustomizer jacksonCustomizer() { return builder -> builder.modules(new SimpleModule().setSerializerModifier(new MaskingBeanSerializerModifier())); }
- 简化字段注解,只保留
@Masked即可(无需再手动加@JsonSerialize):
@Masked private String sensitiveField;
效果验证
修改后,只有标记了@Masked的字段会被掩码,Spring Boot的异常响应里的error、message、path等String字段会正常显示,不再被掩码。
内容的提问来源于stack exchange,提问作者Foobar
相关产品推荐
相关产品推荐

