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

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

В следующем примере класс AltClass3 задан в файле jar2/META-INF/beans.xml как <alternative>. При этом класс не указан как <alternative> в файле 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: изменение принципов работы.