Java Sonar:实例方法不应写入;“静态”;领域
Sonar提示我:实例方法不应写入“静态”字段 我不太确定我需要改变什么来解决这个问题 “SemanitorProxy.applicationContext”是否必须等于静态方法Java Sonar:实例方法不应写入;“静态”;领域,java,spring,static,sonarqube,Java,Spring,Static,Sonarqube,Sonar提示我:实例方法不应写入“静态”字段 我不太确定我需要改变什么来解决这个问题 “SemanitorProxy.applicationContext”是否必须等于静态方法 public class SemaMonitorProxy implements ApplicationContextAware { private static ApplicationContext applicationContext = null; public void registerFa
public class SemaMonitorProxy implements ApplicationContextAware {
private static ApplicationContext applicationContext = null;
public void registerFailedLoginAttempt(HttpServletRequest request, HttpServletResponse response) {
final SemaMonitor semaMonitor = applicationContext.getBean(SemaMonitor.class);
semaMonitor.registerFailedLoginAttempt(request, response);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SemaMonitorProxy.applicationContext = applicationContext;
}
}
事实上,这种方法:
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SemaMonitorProxy.applicationContext = applicationContext;
}
是写入静态字段的实例方法:
private static ApplicationContext applicationContext
不能将上述方法设置为静态。因此,唯一的解决方案是从applicationContext
声明中删除static关键字
private ApplicationContext applicationContext
我不是声纳专家,但我能想象的是,并行写入静态场可能是危险的。只需尝试在SemanitorProxy.class上添加一个同步块,看看警告是否消失。问题是您正在通过非静态字段设置静态字段的值。能否将
setApplicationContext
方法设置为synchronized
?我相信这就足够解决这个问题了。中有一个合适的解决方案。我不能将setApplicationContext设置为静态,因为这样它就不能覆盖ApplicationContextAware,因为它是spring框架的一部分,所以我不能更改它。@KevinM:完全正确。我建议将applicationContext设置为非静态。它通常是一个在内存中只存在一次的单例。我已经更新了答案。