Java Sonar:实例方法不应写入;“静态”;领域

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

Sonar提示我:实例方法不应写入“静态”字段

我不太确定我需要改变什么来解决这个问题

“SemanitorProxy.applicationContext”是否必须等于静态方法

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设置为非静态。它通常是一个在内存中只存在一次的单例。我已经更新了答案。