【问题标题】:How to avoid "code smell" when using @NamedEntityGraphs annotation?使用@NamedEntityGraphs 注解时如何避免“代码异味”?
【发布时间】:2021-01-20 05:13:33
【问题描述】:

在 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 以获得兼容的代码?

【问题讨论】:

  • 为什么不直接删除@NamedEntityGraphs,因为正如您的工具所指出的,它是不必要的? @NamedEntityGraph 注解是@Repeatable

标签: java jpa spring-data-jpa annotations entitygraph


【解决方案1】:

按照工具告诉您的操作(以及 cmets 中的 @Slaw):删除外部注释并重复 @NamedEntityGraph which is ok since it is @Repeatable with 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 {  ...  }

【讨论】:

    【解决方案2】:

    您已经在代码中给出了答案。 只需删除@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 {  ...  }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-18
      • 1970-01-01
      • 1970-01-01
      • 2022-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多