我的程序中有以下代码,在与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);
} }
答案 0 :(得分:7)
具体而言,您似乎在询问规则S2696,'实例方法不应写入"静态"字段'
正如规则描述详述:
正确地从非静态方法更新
static
字段很难做到正确,如果有多个类实例和/或多个线程在运行,很容易导致错误。理想情况下,static
字段仅从synchronized static
方法更新。
因此,问题在于告诉您创建它所引发的方法(大概是setApplicationContext
)static
,以便在所有类实例中只有一个副本的方法进行更新static
(即在所有类实例中共享)字段applicationContext
。它还建议使用方法synchronized
,以便一次只能调用一个实例。
答案 1 :(得分:1)
对于它的价值,我可能会因此特别地被Sonar社区和Java Universe列入黑名单,因为在冒犯性方法的顶部添加@SuppressWarnings("squid:S2696")
导致Sonar忽略了这一点完全警告。
答案 2 :(得分:0)
这对我有用。
@Setter
private static volatile ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext ac) throws BeansException {
setContext(ac);
}