Использование инъекции конструктора Spring с SonarQube - PullRequest
0 голосов
/ 12 января 2019

У меня есть фрагмент кода с инъекциями полей, которые я пытаюсь преобразовать, чтобы использовать инъекции конструкторов. Исходный код выглядит так:

@Autowired
private Environment env;

@Autowired
private YYYAdaptor yyyAdaptor;

@Autowired
private JAXBContext jaxbContext;

И вот как я это переписал:

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;
}

Выполнение этого дает мне критическую уязвимость при сканировании сонара, когда «этот элемент» ссылается на каждую из объявленных переменных:

Аннотируйте этот элемент с помощью "@Autowired", "@Resource", "@Inject" или "@Value" или удалите его

Как лучше всего избегать использования полевых инъекций, избегая при этом посадки сонара?

1 Ответ

0 голосов
/ 12 января 2019

Ознакомьтесь с правилом SonarQube RSPEC-4288: в компонентах Spring должен использоваться инжектор конструктора . Хотя это и не объясняет, почему использование final инициируется как несовместимое, существует пример кода, соответствующего требованиям. Инициализируйте поля как null, чтобы сделать его совместимым с SonarQube:

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

Однако, что говорит SonarQube, это не священно и заполнено множеством ложных срабатываний . Эти статические анализаторы решают проблемы, которые стоят - дальнейший самоанализ, но не окончательный и основанный на правилах, сделанных людьми с мнениями.

Лично я бы пометил эту проблему как , не исправит и объявил бы поля как final, чтобы сделать объект неизменным:

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