我正在使用CDI初始化数据源(请参阅我之前的问题:DataSource initialization error within liberty profile server)
public abstract class DAOBase {
@Resource(name="jdbc/Oracle", lookup = "jdbc/Oracle")
private DataSource ds;
直接从REST类初始化DAO类时,这很有效:
@Path("/audit")
public class AuditREST extends RESTBase implements AuditRESTInterface {
@Inject
private AuditDAO auditDAO = new AuditDAO();
当REST类调用一个调用DAO的中间类时,我可以通过以下方式完成:
public class JobConfigurationREST extends RESTBase implements JobConfigurationRESTInterface {
@Inject
private JobRunner jr = new JobRunner();
public class JobRunner implements Runnable{
@Inject
private JobConfigurationDAO jcDAO = new JobConfigurationDAO();
然而,JobRunner还包含一个方法,可以动态创建类的一些实例(SampleModel)。然后SampleModel包含一个我需要注入的dao。
public class SampleModel extends Step implements Model {
@Inject
private ModelDAO modelDAO = new ModelDAO();
我看不到在JobRunner和SampleModel之间添加链接的方法。我该怎么做?
或者,这甚至是必要的吗?我觉得必须指定REST类和DAO类之间的所有链接过于复杂,我应该能够在某处声明SampleModel(可能是beans.xml?),容器应该为我处理所有事情。< / p>
编辑:
我在这里简化了问题。 SampleModel是通过Job类创建的,Job类是通过JobBuilder类中的方法创建的(我似乎也无法注入)。
JobBuilder jb = new JobBuilder();
Job j = jb.buildJob(jc, jobContext);
SampleModel也是通过buildJob方法深处的反射创建的。
public Job buildJob(JobConfiguration inJobConfiguration, JobContext inJobContext) {
stepList.add(ModelFactory.getInstance().getModel(sc.getImplementationName()));
}
在工厂内:
ret =(Model)Class.forName(tmpImplDetail.getClassName())。newInstance();
答案 0 :(得分:1)
您的问题似乎是您希望将@Inject移动到不是容器执行注入的组件的类中。
您可以通过将新的对象分配到注射点的方式来掩盖这一点。
如果你没有做奇怪的任务,你会问更多关于“为什么我的@Inject字段为空?”的常见问题解答。