Здесь один класс является подклассом другого. Следовательно, аннотация @Typed используется для предотвращения неоднозначности @Inject.Предупреждение о неоднозначной зависимости с реализацией подкласса с использованием @Typed в CDI
@Dependent
public class UserScope extends Scope {}
@Dependent
@Typed(UserScopeAllowIdEquals.class) // Restrict bean type.
public class UserScopeAllowIdEquals extends UserScope {}
Следующее использование вызывает осмотр предупреждения в Intellij:
public class A {
@Inject UserScope userScope;
}
неоднозначной зависимость: Есть несколько бобов, которые соответствуют точке впрыска
Однако, компилирует приложение и работает, контейнер не рассматривает его как ошибку определения. Есть ли проблема с тем, как она написана? Я подозреваю, что нет, если this answer to a different question верен, чтобы указать, что будет только один компонент, чьи типы бобов содержат суперкласс.
ПРИМЕЧАНИЕ. Следующее использование, как и ожидалось, не вызывает предупреждения Intellij. не
public class B {
@Inject UserScopeAllowIdEquals usaie;
}
После добавления 'default' спецификатору 'UserScope' Я все еще получаю предупреждение« Неоднозначная зависимость », где я вставляю' UserScope'. Чтобы избежать путаницы, базовый класс Scope Scope является абстрактным и поэтому никогда не будет вводить «Scope». –
@PatrickGarner вам действительно нужно вводить абстрактный класс, а не конкретную реализацию. – maress
Мне нужно вводить RoleScope, PermissionScope, AcademicYearScope, TransitionLogScope и т. Д., Один тип области для каждой таблицы базы данных. Все они расширяют область действия. UserScopeAllowIdEquals - единственное чудо в кучке, расширяющее UserScope вместо Scope. –