2

在 IntellyJ Idea 中,我安装了 SonarLint。

代码分析器说我必须从此注释组中删除“NamedEntityGraphs”包装器。这是我的代码:

@NamedEntityGraphs({
        @NamedEntityGraph(
                name = Application.ONLY_NAME,
                attributeNodes = {
                        @NamedAttributeNode("foo"),
                        @NamedAttributeNode("bar")
                }
        ),
        @NamedEntityGraph(name = Application.FULL,
                attributeNodes = {
                        @NamedAttributeNode("foo"),
                        @NamedAttributeNode("bar"),
                        @NamedAttributeNode("buzz")
                }
        )
})
public class SomeClass {  ...  }

以下是 SonarLint 的论点:

注解重复不应该被包裹 代码异味,Minor,java:S1710

在 Java 8 之前,如果您需要使用同一注解的多个实例,则必须将它们包装在容器注解中。在 Java 8 中,这不再是必要的,允许更清晰、更易读的代码。请注意,当项目的 sonar.java.source 低于 8 时,此规则会自动禁用。

不合规代码示例

@SomeAnnotations({ // Noncompliant
        @SomeAnnotation(..a..)
        @SomeAnnotation(..b..)
        @SomeAnnotation(..c..)
})
public class SomeClass {  ...  }

 

合规解决方案

@SomeAnnotation(..a..)
@SomeAnnotation(..b..)
@SomeAnnotation(..c..)
public class SomeClass {  ...  }

问题:

是否有人知道如何组织@NamedEntityGraphs 以获得兼容的代码?

4

2 回答 2

2

就像工具告诉你的那样(以及评论中的@Slaw):删除外部注释并重复@NamedEntityGraph这没关系,因为它适用@Repeatable于 JPA 2.2

@NamedEntityGraph(
        name = Application.ONLY_NAME,
        attributeNodes = {
                @NamedAttributeNode("foo"),
                @NamedAttributeNode("bar")
        }
),
@NamedEntityGraph(name = Application.FULL,
        attributeNodes = {
                 @NamedAttributeNode("foo"),
                 @NamedAttributeNode("bar"),
                 @NamedAttributeNode("buzz")
       }
)
public class SomeClass {  ...  }
于 2021-01-20T06:33:18.990 回答
0

您已经在代码本身中给出了答案。只需删除@NamedEntityGraphs

@NamedEntityGraph(name = Application.ONLY_NAME,
                attributeNodes = {
                        @NamedAttributeNode("foo"),
                        @NamedAttributeNode("bar")
                }
        )
@NamedEntityGraph(name = Application.FULL,
                attributeNodes = {
                        @NamedAttributeNode("foo"),
                        @NamedAttributeNode("bar"),
                        @NamedAttributeNode("buzz")
                }
        )
public class SomeClass {  ...  }
于 2021-01-22T13:30:52.427 回答