Классы, имеющие обе аннотации Specializes и Alternative, не внедряются в другие модули

Это правило отмечает классы, имеющие обе аннотации @Specializes и @Alternative. Если на класс ссылается класс из другого модуля, то этот класс не инжектируется в другой модуль если только он не перечислен в <alternatives> в META-INF/beans.xml другого модуля.

В следующем примере класс AltClass3 указан в jar2/META-INF/beans файле.xml в <alternatives>. Класс не указан в <alternatives> в файле jar1/META-INF/beans файле.xml.


WEB-INF/lib/jar1:
  Class1 {
    @Inject @SomeQualifer String foo;
  }
 
WEB-INF/lib/jar2:
  Class2 {  @Produces @SomeQualifer String doFoo() { ... } 
  }
  @Alternative @Specializes AltClass3 расширяет Class2 {  @Produces @SomeQualifer String doFoo() { ... } 
  }  

В реализации Contexts and Dependency Injection (CDI) 1.0 класс Class2 внедряется и используется как Producer для Class1.foo. В реализации CDI 1.2 класс Class2 не внедряется, и при запуске приложения возникает ошибка, так как не найден Producer для Class1.foo.

Эту неполадку можно устранить двумя способами:

За дополнительной информацией о реализации CDI 1.2 в Java Platform, Enterprise Edition (Java EE) 7 обратитесь к документу Contexts and Dependency Injection 1.2: изменение принципов работы.