2015-08-19 4 views
0

Я в настоящее время реорганизую некоторый унаследованный код и наткнулся на фрагмент, как показано ниже. Как избежать создания класса 'CompanyAuditor' и использовать CDI для его создания?Мгновенный список объектов с CDI

return compDAO.getAll() 
       .stream() 
       .map(CompanyAuditor::new) 
       .collect(Collectors.toList()); 
+0

Это маловероятно, что при условии, фрагмент кода является унаследованного кода, поскольку она требует Java-8 функций. Предоставьте также устаревший код. –

+0

@TagirValeev Спасибо за ответ. Первоначально он был «за цикл» над списком объектов Компании, возвращаемых CompanyDAO.getAll(), создавая объекты CompanyAuditor для каждого объекта «Компания» и возвращающий список объектов CompanyAuditor. Кто-то еще переписал его с помощью потоков. – ShellDragon

ответ

1

Единственный способ определить конструктор без аргументов для CompanyAuditor, создавать новые экземпляры, используя javax.enterprise.inject.Instance.get. А потом передайте все аргументы, используя общедоступные методы. Поэтому ваш конструктор с аргументом должен быть разделен на один без аргументов и дополнительный общедоступный метод для установки этого аргумента. Кроме того, вы должны написать собственное выражение лямбды, которое сложнее, чем просто CompanyAuditor :: new.

Полный пример:

@Inject 
@New // javax.enterprise.inject.New to always request a new object 
private Instance<CompanyAuditor> auditorInjector; 

public List returnAllWrappedAuditors() { 
    return compDAO.getAll() 
      .stream() 
      .map(ca -> { 
        CompanyAuditor auditor = auditorInjector.get(); 
        auditor.setWrappedObject(ca); 
        return auditor; 
       }) 
      .collect(Collectors.toList()); 
} 

Afternote:

CDI не очень прост в использовании при динамическом построении объектов, то при инъекционном превосходном качестве зависимостей. Поэтому это немного более многословно, чем вызов конструктора для создания новых объектов.

CDI бобы должны быть либо конструктор без параметров или все параметры annoted с @Inject (который не помогает в вашем случае) See Java EE 7 tutorial

+0

Это всеобъемлющий ответ. Спасибо @OnderjM – ShellDragon

+0

Использование '@ New' сильно обескуражено в рамках CDI, и этот подход обычно известен многими проблемами производительности. Если 'CompanyAuditor' является классом DTO/domain, он должен быть просто создан, если только он также не имеет точек впрыска, то это правильный подход, но может иметь утечку памяти. –

+0

@JohnAment Это правда, что '@ New' устарел в CDI2, но я хотел сделать свой ответ коротким. Предложено использовать нормальную инъекцию и обеспечить наличие «@ зависимой» сферы. В этом случае я бы, по крайней мере, пометил точку инъекции специальным квалификатором, например '@ NewInstance', просто чтобы отметить, что мы каждый раз запрашиваем создание нового объекта. – OndrejM

Смежные вопросы