Usando injecção construtor da mola com SonarQube

Victor S:

Eu tenho um pedaço de código com injeções de campo Eu estou tentando converter a usar injeções construtor vez. O código inicial se parece com isso:

@Autowired
private Environment env;

@Autowired
private YYYAdaptor yyyAdaptor;

@Autowired
private JAXBContext jaxbContext;

E é assim que eu reescrevê-lo:

private Environment env;
private YYYAdaptor yyyAdaptor;
private JAXBContext jaxbContext;

@Autowired
public YYYResource(Environment env, YYYAdaptor yyyAdaptor, 
    @Qualifier("YYYYReq") JAXBContext jaxbContext) {

    this.env = env;
    this.yyyAdaptor = yyyAdaptor;
    this.jaxbContext = jaxbContext;
}

Fazendo isso me dá uma vulnerabilidade crítica na varredura sonar, com "este membro" referindo-se a cada uma das variáveis ​​declaradas:

Anotar esse membro com "@Autowired", "@Resource", "@Inject", ou "@value", ou removê-lo

Qual é a melhor maneira que eu posso evitar o uso de injeções de campo, evitando sonar jogando um ajuste?

Nikolas:

Saída a regra SonarQube RSPEC-4288: componentes Primavera deve usar injeção de construtor . Apesar de não explicar por que o finaluso é acionado como não conforme, há um exemplo de código compatível. Inicializar os campos como nullpara torná-lo compatível SonarQube:

private Environment env = null;
private YYYAdaptor yyyAdaptor = null;
private JAXBContext jaxbContext = null;

No entanto, o que SonarQube diz é não sagrada e está repleta de falsos positivos . Estes-analisadores estáticos atinge as questões que são vale a pena o mais introspecção, ainda não definitivo e com base nas regras feitas por pessoas com opiniões.

Pessoalmente, eu marcar esta questão como não irá corrigir e declarar os campos como finalpara tornar o objeto imutável:

private final Environment env;
private final YYYAdaptor yyyAdaptor;
private final JAXBContext jaxbContext;

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=173403&siteId=1
Recomendado
Clasificación