2016-07-26 9 views
0

Здесь один класс является подклассом другого. Следовательно, аннотация @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; 
} 

ответ

0

Основываясь на CDI, до тех пор, пока существует более чем одна реализация бина, то @Default классификатор больше не применяется.

Чтобы узнать об этом, вам нужно явно указать CDI, который является компонентом ваших определений, является компонентом по умолчанию.

@Dependent 
@Default 
public class UserScope extends Scope {} 

@Dependent 
@Typed(UserScopeAllowIdEquals.class) // Restrict bean type. 
public class UserScopeAllowIdEquals extends UserScope {} 

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

@Inject 
private Scope scopeBean; // The @Default annotated, if any of a Scope implementation is used. 
+0

После добавления 'default' спецификатору 'UserScope' Я все еще получаю предупреждение« Неоднозначная зависимость », где я вставляю' UserScope'. Чтобы избежать путаницы, базовый класс Scope Scope является абстрактным и поэтому никогда не будет вводить «Scope». –

+0

@PatrickGarner вам действительно нужно вводить абстрактный класс, а не конкретную реализацию. – maress

+0

Мне нужно вводить RoleScope, PermissionScope, AcademicYearScope, TransitionLogScope и т. Д., Один тип области для каждой таблицы базы данных. Все они расширяют область действия. UserScopeAllowIdEquals - единственное чудо в кучке, расширяющее UserScope вместо Scope. –

 Смежные вопросы

  • Нет связанных вопросов^_^