Spring App SonarQube 问题 S3749

lou*_*mbo 6 java spring sonarqube

我的 Spring 应用程序和 SonarQube 遇到了问题。SQ 正在用“用“@Autowired”、“@Resource”、“@Inject”或“@Value”注释这个成员,或将其删除。” 在实例变量 mapLoadedByDatabaseCalls 上

示例 1:

@Service
public class Service implements InitializingBean  {

    @Autowired
    private Dao dao;

    private Map<Object, Object> mapLoadedByDatabaseCalls;

    @Override
    public void afterPropertiesSet() throws Exception {
        mapLoadedByDatabaseCalls= new HashMap<>(Object.class);
        ....
    }
}
Run Code Online (Sandbox Code Playgroud)

示例 2:

@Service
public class Service {

    @Autowired
    private Dao dao;

    private Map<Object, Object> mapLoadedByDatabaseCalls;

    @PostConstruct
    private void setMap() {
        mapLoadedByDatabaseCalls= new HashMap<>(Object.class);
        ....
    }
}
Run Code Online (Sandbox Code Playgroud)

DI 完成后实例化变量的正确方法是什么?

Pau*_*kin 2

我相信这是笨拙的并且您的原始代码更好,但这将消除 SonarQube 投诉。在 @Bean 中初始化您的映射,然后将其引用为 @Autowired。使用@PostConstruct 中的数据加载地图。

@Bean
public Map<Object, Object> getMapLoadedByDatabaseCalls() {
    return new HashMap<>(Object.class);
}

@Autowired
private Map<Object, Object> mapLoadedByDatabaseCalls;

@PostConstruct
private void setMap() {
    ...
    // load data into the map
    mapLoadedByDatabaseCalls.put(key, value);
    ....
}
Run Code Online (Sandbox Code Playgroud)

  • 这解决了问题,但是变量的范围变成了应用程序级别与类级别。考虑到该变量仅在一个类中需要,为每个实例变量创建一个 bean 是否有意义?应用程序最终将拥有许多仅在特定类中需要的 bean。 (2认同)