如何处理SonarQube标记Jackson StdDeserializer缺少无参构造函数的问题
StdDeserializer触发Sonar RSPEC-2055规则的正确处理方案
规则触发根因
该规则要求反序列化器提供无参构造,核心是Jackson在两类场景下会自行实例化反序列化器:
- 通过SPI机制自动注册反序列化器
- 反序列化器本身需要被序列化后再重建实例
如果没有无参构造,上述场景会直接抛出InstantiationException异常。
推荐处理方案
方案1:显式添加合法的无参构造(优先选择)
直接在自定义反序列化器中实现无参构造,主动调用父类StdDeserializer的带参构造传入目标反序列化类,避免父类初始化报错:
public class CustomOrderDeserializer extends StdDeserializer<Order> { // 满足Sonar规则的无参构造 public CustomOrderDeserializer() { super(Order.class); } // 可保留原有带参构造用于手动注册场景 public CustomOrderDeserializer(Class<Order> targetClass) { super(targetClass); } @Override public Order deserialize(JsonParser parser, DeserializationContext context) throws IOException { // 自定义反序列化逻辑实现 Order order = new Order(); // 字段解析赋值逻辑 return order; } }
注意:不要实现空的无参构造而不调用父类的
StdDeserializer(Class<?>)构造,否则父类初始化时会抛出空指针异常,无法正常使用。
该方案兼容所有Jackson反序列化器注册方式,完全符合规则要求,无潜在风险。
方案2:明确忽略规则(仅确认无自动实例化场景时使用)
如果你可以确定该反序列化器只会通过手动new的方式注册到ObjectMapper,不会触发Jackson自动实例化逻辑,可直接在类上添加注解忽略该规则:
@SuppressWarnings("java:S2055") public class CustomOrderDeserializer extends StdDeserializer<Order> { // 只有原有带参构造,无无参构造 public CustomOrderDeserializer(Config config) { super(Order.class); this.config = config; } // 反序列化逻辑 }
注意:使用该方案前必须确认不存在SPI注册、反序列化器序列化的场景,否则运行时会抛出实例化失败异常。
内容的提问来源于stack exchange,提问作者Jaroslav Záruba
相关产品推荐
相关产品推荐

