2015-03-06 5 views
1

Я застрял в печально известном WELD-001408, что все программисты с CDI столкнулись так или иначе. Использование Oracle JDK 1.8.0_25, Wildfly 8.2.0.Final. Мой код выглядит следующим образом:WELD-001408: Невыполненные зависимости для типа Список с квалификаторами

модуль availability-service (war) зависит от модуля hospital-user (jar). Former имеет beans.xml в WEB-INF, а затем в META-INF, хотя CDI 1.1 не требует beans.xml.

В hospital-user:

@ApplicationScoped 
public class Users { 
    @Produces 
    @Doctors 
    public List<Doctor> getDoctors() { 
     return getUsers("/doctors.json", Doctor.class); 
    } 

    @Produces 
    @Patients 
    public List<Patient> getPatients() { 
     return getUsers("/patients.json", Patient.class); 
    } 
} 

Врачи аннотаций (Patients аналогичен кроме названия):

@Qualifier 
@Retention(RUNTIME) 
@Target({ FIELD, METHOD }) 
public @interface Doctors { 
} 

В availability-service:

@ApplicationScoped 
public class AvailabilityService { 
    @Inject 
    @Doctors 
    private List<Doctor> doctors; 
} 

Ошибка:

Caused by: org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type List<Doctor> with qualifiers @Doctors 
    at injection point [BackedAnnotatedField] @Inject @Doctors private name.abhijitsarkar.microservices.availability.AvailabilityService.doctors 
    at name.abhijitsarkar.microservices.availability.AvailabilityService.doctors(AvailabilityService.java:0) 

    at org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:372) 

Если я закачиваю Users вместо List, он работает. Here - образец проекта Maven, который демонстрирует проблему с 4 классами. Просто запустите mvn clean test.

ответ

0

В примере проекта Maven, который вы предоставили, инъекция зависимостей в тестовом классе недоступна, так как вы указали свое развертывание Arquillian как @Deployment(testable = true).

Когда установлено значение true, которое является значением по умолчанию, проходит тест.

Кроме того, добавив следующую точку впрыска в методе испытания:

@Inject 
@Employees 
List<Employee> employees; 

работает отлично, который показывает, что развертывание боба является действительным.

Он продолжает работать, когда Arquillian развертывания в точности соответствует структуре приложения WAR, что вы изображенную, т.е .:

@Deployment 
public static WebArchive createDeployment() { 
return create(WebArchive.class, "availability-service.war") 
    .addAsLibraries(create(JavaArchive.class, "hospital-user.jar") 
     .addPackages(true, Filters.exclude(".*Test.*"), Producer.class.getPackage()) 
     .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml")) 
    .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml"); 
} 
Смежные вопросы