Java 声纳抱怨制造封闭方法”;“静态”;或者移除这一组

Java 声纳抱怨制造封闭方法”;“静态”;或者移除这一组,java,spring,performance,static,sonarqube,Java,Spring,Performance,Static,Sonarqube,我的程序中有下面的代码,在与Maven集成后,我正在运行SonarQube 5进行代码质量检查 然而,声纳要求将封闭方法设置为“静态”或移除这一组。方法是setApplicationContext 如何删除此错误?为什么会出现这种错误 public class SharedContext implements ApplicationContextAware { public static final String REPORT_ENGINE_FACTORY = "reportEngineFact

我的程序中有下面的代码,在与Maven集成后,我正在运行SonarQube 5进行代码质量检查

然而,声纳要求将封闭方法设置为“静态”或移除这一组。方法是setApplicationContext

如何删除此错误?为什么会出现这种错误

public class SharedContext implements ApplicationContextAware {
public static final String REPORT_ENGINE_FACTORY = "reportEngineFactory";
private static ApplicationContext applicationContext;

public void setApplicationContext(ApplicationContext applicationContext)
        throws BeansException {
    SharedContext.applicationContext = applicationContext;
}

public static ApplicationContext getApplicationContext() {
    return applicationContext;
}

public Object getBean(String name) {
    return applicationContext.getBean(name);
} }

具体来说,您似乎在询问规则S2696,“实例方法不应写入“静态”字段”

如规则描述详细信息所示:

从非静态方法正确更新
静态
字段很难做到正确,如果存在多个类实例和/或多个线程,则很容易导致错误。理想情况下,
静态
字段仅从
同步静态
方法更新

因此,问题是告诉您使提出它的方法(可能是
setApplicationContext
static
,这样在所有类实例中,只有一个方法的副本更新
static
(即在所有类实例中共享)字段
applicationContext
。它还建议将方法
同步化
,以便一次只有一个实例可以调用该方法


后期编辑:要查看规则说明,请单击问题消息后显示的“查看规则”或“…”(取决于您的SonarQube版本)。

了解它的价值,我可能会因为这样说而被Sonar社区和Java世界列入黑名单,将
@SuppressWarnings(“squid:S2696”)
添加到违规方法的顶部会导致Sonar完全忽略该警告。

这对我来说很有效

@Setter
private static volatile ApplicationContext context;

@Override
public void setApplicationContext(ApplicationContext ac) throws BeansException {
    setContext(ac);
}

要添加一些上下文,任何开发人员如果看到您有一个非静态的
setApplicationContext
方法,都会认为它只会更改该实例的应用程序上下文,而不会更改应用程序的所有实例的应用程序上下文。您不能将其设置为静态。因为您将违反ApplicationContextawarRewhere的合同,您找到此规则描述了吗?请参阅我的扩展@Nick@ccellist,OP询问“如何删除此错误?为什么会出现此错误?”我想我已经相当彻底地回答了这两个问题。