diff --git a/.gitignore b/.gitignore index d1b60cfa4d..168c8bc683 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,6 @@ Desktop.ini .java-version .mvn/.develocity/ + +CLAUDE.md +.claude diff --git a/java-checks-test-sources/default/src/main/java/checks/spring/NullableInjectedFieldsHaveDefaultValueSample.java b/java-checks-test-sources/default/src/main/java/checks/spring/NullableInjectedFieldsHaveDefaultValueSample.java index 5b8f903a91..36aac04807 100644 --- a/java-checks-test-sources/default/src/main/java/checks/spring/NullableInjectedFieldsHaveDefaultValueSample.java +++ b/java-checks-test-sources/default/src/main/java/checks/spring/NullableInjectedFieldsHaveDefaultValueSample.java @@ -118,4 +118,22 @@ private String setNothingWithTwoParameters(@Nullable String a, String b) { @org.jspecify.annotations.Nullable @Value("${my.property_jspecify}") // Noncompliant {{Provide a default null value for this field.}} [[sc=3;ec=27;secondary=-1]] private String myProperty_jspecify; + + // Test case from SONARJAVA-5866: @NonNull parameters should not trigger the rule + public String shouldNotTriggerOnNonNullParameter(@Value("${x}") @org.jspecify.annotations.NonNull String x) { // Compliant - NonNull means no default null value needed + return x; + } + + public String shouldNotTriggerOnNonNullParameterFindbugs(@Value("${y}") @edu.umd.cs.findbugs.annotations.NonNull String y) { // Compliant - NonNull means no default null value needed + return y; + } + + // NonNull fields should also not trigger + @org.jspecify.annotations.NonNull + @Value("${my.nonnull.property}") // Compliant - NonNull means no default null value needed + private String myNonNullProperty_jspecify; + + @edu.umd.cs.findbugs.annotations.NonNull + @Value("${my.nonnull.property2}") // Compliant - NonNull means no default null value needed + private String myNonNullProperty_findbugs; } diff --git a/java-checks/src/main/java/org/sonar/java/checks/spring/NullableInjectedFieldsHaveDefaultValueCheck.java b/java-checks/src/main/java/org/sonar/java/checks/spring/NullableInjectedFieldsHaveDefaultValueCheck.java index f1fdf38da0..a162ce37fb 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/spring/NullableInjectedFieldsHaveDefaultValueCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/spring/NullableInjectedFieldsHaveDefaultValueCheck.java @@ -173,6 +173,14 @@ private static Optional getNullableAnnotation(VariableTree field if (instance == null) { return Optional.empty(); } + // Only return if the annotation is actually nullable (not non-null) + // Prefer not raising an issue when type is unknown + SymbolMetadata.NullabilityType nullabilityType = nullabilityData.type(); + if (nullabilityType == SymbolMetadata.NullabilityType.NON_NULL || + nullabilityType == SymbolMetadata.NullabilityType.UNKNOWN || + nullabilityType == SymbolMetadata.NullabilityType.NO_ANNOTATION) { + return Optional.empty(); + } return Optional.ofNullable(field.symbol().metadata().findAnnotationTree(instance)); }