Java: s3985 false positive for @JsonValue

Product: SonarQube Community (self-hosted)
sonar-java version: sonar-java 8.28.0.43176 on SonarQube Community Build 26.4.0.121862
Java source level: 21 (javac 21, source/target 17)

Rule

java:S3985 — “Unused private classes should be removed”

Description

S3985 inconsistently handles Jackson-based usages of private nested types: enums referenced via @JsonCreator are recognized as used, while equivalent usage through @JsonValue is incorrectly reported as unused.

Reproducer

package demo;

import java.util.Locale;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;

public class JsonValueExample {
  private JsonValueExample() {}

  // Not flagged — @JsonCreator is recognized as a framework usage.
  private enum FooBarOk {
    FOO, BAR;

    @JsonCreator
    static FooBarOk of(String value) {
      return valueOf(value.toUpperCase(Locale.ROOT));
    }
  }

  // Flagged by S3985 as "unused private class", even though @JsonValue
  // makes this enum reachable from {NAME} exactly like the one above.
  private enum FooBarBad {
    FOO, BAR;

    @JsonValue
    String value() {
      return name().toLowerCase(Locale.ROOT);
    }
  }
}