2015-03-03 4 views
1

У меня есть три класса, определенные ниже.CDI Неопределенное исключение разрешения

class A { 
} 

class B extends A{ 
} 

class C extends A{ 
} 

class D{ 
//Inject class A 
} 

Я вводил класс A в класс D. CDI бросает исключение из-за неоднозначного разрешения. Каков правильный способ решить эту проблему? Ценю вашу помощь.

+0

Можете ли вы опубликовать stacktrace, пожалуйста? –

ответ

2

Вы можете использовать Квалификационные, так что ваш код будет выглядеть следующим образом:

@ClazzA 
class A { 
} 

@ClazzB 
class B extends A{ 
} 

@ClassC 
class C extends A{ 
} 

и когда вы пытаетесь внедрить, вы будете делать что-то вроде этого:

@Inject @ClassA 
A a; 

Проверьте Weld Doc

+0

Созданы квалификаторы и аннотированные классы и точки инжекции с именами квалификаторов. Теперь он бросает UnsatisfiedResolutionException. org.apache.webbeans.exception.inject.DeploymentException: javax.enterprise.inject.UnsatisfiedResolutionException: Тип Api [имя_файла] не найден с квалификаторами – Venu

+0

Можете ли вы загрузить проект, чтобы я мог проверить вас? –

+0

У меня была проблема с classpath в моем проекте. Он работает с квалификаторами, как только я решил проблему с classpath. Спасибо. – Venu

6

Анкета @Typed позволяет restricting bean types, чтобы вы могли написать:

class A { 
} 

@Typed(B.class) 
class B extends A { 
} 

@Typed(C.class) 
class C extends A { 
} 

class D { 
//Inject class A 
} 

В вашем развертывании beans types класса bean B (соотв. C) будут ограничены B и Object (соответственно C и Object), так что будет существовать только один компонент, чьи типы бобов содержат тип A, и будет разрешено двусмысленное разрешение.

Обратите внимание, что аннотация @Typed доступна с CDI 1.0.

+0

Я попробую с вашим предложением. Другой ответ работал для меня, так что я принимал его как ответ. – Venu

+0

Я предпочитаю этот ответ, потому что вам не нужно создавать новую аннотацию для каждого подтипа – Teg

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