Я использую CDI инициализировать DataSource (см мой предыдущий вопрос: DataSource initialization error within liberty profile server)CDI Инъекция через несколько уровней?
public abstract class DAOBase {
@Resource(name="jdbc/Oracle", lookup = "jdbc/Oracle")
private DataSource ds;
Это хорошо работает, когда класс DAO инициализируется непосредственно из класса REST:
@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 также продолжение ains метод, который на лету создает некоторые экземпляры класса (SampleModel). SampleModel затем содержит dao, который мне нужно ввести.
public class SampleModel extends Step implements Model {
@Inject
private ModelDAO modelDAO = new ModelDAO();
Я не вижу возможности добавления ссылки между JobRunner и SampleModel. Как мне это сделать?
В качестве альтернативы, это даже необходимо? Я чувствую, что необходимость указывать все ссылки между классом REST и классом DAO слишком сложна, и я должен иметь возможность объявлять SampleModel где-нибудь (возможно beans.xml?), И контейнер должен заботиться обо всем для меня.
EDIT:
Я упрощая проблему здесь. SampleModel создается с помощью класса 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 = (модель) Class.forName (tmpImplDetail.getClassName()) newInstance();
James, когда вы делаете '@ Inject', не создавайте с помощью' new'. Просто напишите '@Inject private JobRunner jr;' Пожалуйста, также покажите, как вы используете SampleModel. – Gas
Это только для JobRunnner? Is @Inject private AuditDAO auditDAO = новый AuditDAO(); Не так ли? Я уточню вопрос с деталями для SampleModel –
Это вообще.Потому что вся идея состоит в том, что контейнер ** инъецирует ** экземпляр, а не вы создаете его вручную (через 'new'). – Gas