Java CDI выбирает альтернативу без приоритета

Я пытаюсь заменить реализацию по умолчанию, предоставленную DeltaSpike (LocaleResolver), своей собственная реализация через @Alternative.

@Alternative
@RequestScoped
public class ExampleLocaleResolver implements LocaleResolver {

}
<alternatives>
  <class>org.example.app.ExampleLocaleResolver</class>
</alternatives>

Кажется, единственный способ сделать ExampleLocaleResolver выбранным компонентом — использовать @Priority или @Specializes.

Например, следующие два работают отлично:

@Priority(1)
@Alternative
@RequestScoped
public class MyLocaleResolver implements LocaleResolver {

}
@Specializes
@RequestScoped
public class MyLocaleResolver extends DefaultLocaleResolver {

}

Насколько я понимаю, с CDI 1.1+ должна быть возможность переопределить bean-компоненты из библиотек с альтернативами без каких-либо взломов.

Может ли кто-нибудь помочь мне понять, почему я не могу внедрить bean-компонент @Alternative без аннотации @Priorty?


person Seth Falco    schedule 23.05.2020    source источник


Ответы (1)


(Предупреждение: я слаб в области @Alternative, но думаю, что понимаю это и могу точно на него ответить.)

Я думаю, проблема в том, что без использования @Priority вы ограничены в утверждениях об архивах bean-компонентов, и ваш архив bean-компонентов не совпадает с архивом bean-компонентов, из которого получен DeltaSpike LocaleResolver. Насколько я понимаю, в CDI 1.1+ единственный способ вызвать для всего приложения @Alternative выбор осуществляется с помощью @Priority аннотации.

person Laird Nelson    schedule 23.05.2020
comment
Спасибо, ваше объяснение и документы прояснили ситуацию. Я знал, что CDI 1.1 допускает глобальные альтернативы, я просто не знал, что для включения этой функциональности необходим приоритет. - person Seth Falco; 23.05.2020