У меня есть следующие классы:CDI @Specializes и Constructor Injection с @PostConstruct
@Named
@ViewScoped
public class BaseClass {
private SomeDependency dep;
public BaseClass(){}
@Inject
public BaseClass(SomeDependency dep) {
this.dep = dep;
}
@PostConstruct
private void initialize() {
dep.doSomething(); // Point "A"
}
public String getProperty() {
return "BaseClass-Property";
}
@Specializes
public class SpecialClass extends BaseClass() {
@Override
public String getProperty() {
return "SpecialClass-Property";
}
}
Сейчас в некоторых .xhtml у меня есть что-то вроде
<h:outputText value="#{baseClass.property}" />
Это прекрасно работает без SpecialClass
. Он разбивается с NullPointerException
в точке «А», если я включаю в проект SpecialClass
.
Ну, по to the Weld specification, это более или менее намеченная поведение:
Когда включен боб специализируется другой компонент, другой боб никогда не инстанциированы называется контейнером.
Тем не менее, теперь я должен убедиться, что каждый @Specializes
компонент реализует полный конструктор как
public SpecialClass() {}
@Inject
public SpecialClass(SomeDependency dep) { super(dep); }
что ИМХО это вид нелогичных и производит много дублируются, шаблонный код, особенно с что-то вроде 5-6 аргументов для каждого конструктора. Кроме того, это никогда не захватывается при создании нового специализированного компонента, поскольку проект всегда компилируется.
Я делаю что-то неправильно или нет альтернативы реализации конструкторов снова и снова?
BTW, я использую конструктор Injection для создания легко проверяемых классов, где я могу просто использовать конструктор для «Inject» фиктивных реализаций зависимостей.
Несомненно, даже некорректная реализация java-образа по умолчанию не будет выполнена. Конструкторы не наследуются, кроме конструктора no-arg по умолчанию. – maress
Ну, я знаю о «сыром» экземпляре, я надеялся, что логика CDI отнимает у меня эту нагрузку как программиста ... ;-) –