【发布时间】:2018-01-29 06:27:11
【问题描述】:
如何为数百个服务接口创建一个通用工厂?
我有一个通用的通用超级接口,我的所有服务接口都扩展了它:BaseDao<T>
有数百个(生成的)接口子类化我的BaseDao,例如CustomerDao extends BaseDao<Customer>。当然,我不想为每个子类实现一个工厂。特别是,因为已经有一个DaoFactory,我需要将它“粘合”到我的焊接环境中。
因此,我实现了这个:
@ApplicationScoped
public class InjectingDaoFactory {
@SuppressWarnings("rawtypes") // We *MUST* *NOT* declare a wild-card -- Weld does not accept it => omit the type argument completely.
@Produces
public BaseDao getDao(final InjectionPoint injectionPoint) {
final Type type = injectionPoint.getType();
// ... some checks and helpful exceptions ...
final Class<?> c = (Class<?>) type;
// ... more checks and helpful exceptions ...
@SuppressWarnings("unchecked")
final Class<BaseDao<?>> clazz = (Class<BaseDao<?>>) c;
final BaseDao<?> dao = DaoFactory.getDao(clazz);
return dao;
}
}
在需要这样一个 DAO 的代码中,我现在尝试了这个:
@Inject
private CustomerDao customerDao;
但是我得到了错误org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type CustomerDao with qualifiers @Default -- Weld 不明白我的InjectingDaoFactory 能够提供正确的子类来满足对CustomerDao 的依赖。
请注意,我(当然)没有机会调试我工厂的代码。也许我需要使用InjectionPoint.getMember() 而不是InjectionPoint.getType()——这不是我的问题,现在。我的问题是 Weld 根本不理解我工厂对扩展 BaseDao 的子接口的责任。
那么,我需要做些什么才能让 Weld 了解一个工厂可以提供我的BaseDao common DAO 接口的许多子接口的所有实现?
【问题讨论】:
-
我只是尝试使用
javax.enterprise.inject.spi.Extension,但是一旦存在实现此接口的类,就不会注入任何内容,并且找不到以前找到的依赖项 :-( 我没有甚至(还)在META-INF/services/中注册我的扩展——只是存在一个实现这个接口的类,甚至没有任何方法导致所有依赖项的WELD-001408: Unsatisfied dependencies for type ... with qualifiers ...(我删除了很多用于测试——它似乎影响了所有) . -
我自己已经发现,
javax.enterprise.inject.spi.Extension的实现 必须 not 与服务实现位于同一个项目 (JAR) 中.否则找不到服务。在我将扩展程序移到另一个项目后,它又可以工作了。
标签: java dependency-injection interface factory weld