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?
Saída a regra SonarQube RSPEC-4288: componentes Primavera deve usar injeção de construtor . Apesar de não explicar por que o final
uso é acionado como não conforme, há um exemplo de código compatível. Inicializar os campos como null
para 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 final
para tornar o objeto imutável:
private final Environment env;
private final YYYAdaptor yyyAdaptor;
private final JAXBContext jaxbContext;