Я использую Java 1.7 и Glassfish 4.0.
Существует общий интерфейс Service<T>
с двумя реализациями, где вторая расширяет первую.
public interface Service<T>{
void serve(T t);
}
@Singleton @ServiceQualifier(type=ServiceType.DEFAULT)
public class DefaultService implements Service<MyType>{
public void serve(MyType t){
...
}
}
@Singleton @ServiceQualifier(type=ServiceType.SPECIAL)
public class SpecialService extends DefaultService{
@Override
public void serve(MyType t){
...
}
}
Для использования CDI существует аннотация квалификатора, где ServiceType
— это простое перечисление с ServiceType.DEFAULT
и ServiceType.SPECIAL
.
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD})
public @interface ServiceQualifier {
ServiceType type();
}
Если Служба вводится вот так
@Inject @ServiceQualifier(type=ServiceType.DEFAULT)
private Service service;
контейнер CDI выдает исключение (я развертываю приложение на Glassfish 4, если это имеет значение).
Ошибка при развертывании: исключение при загрузке приложения: ошибка развертывания CDI: WELD-001408 Неудовлетворенные зависимости для типа [Service] с квалификаторами [@ServiceQualifier]
Но если Служба вводится с общим параметром, она работает.
@Inject @ServiceQualifier(type=ServiceType.DEFAULT)
private Service<MyType> service;
Сейчас я очень запутался, потому что думал, что общие параметры удален во время компиляции в Java. Может кто-нибудь объяснить, почему необходимо указывать общий параметр, хотя он скомпилирован?
Заранее спасибо.