Я работаю над приложением Java EE 7 в контейнере Wildfly 8.2, который содержит некоторые объекты, которые существуют в двух источниках данных. Пример:Передача квалификатора CDI в поле ввода
У меня есть баночка с Setting
лица:
@Entity
public class Setting {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@NotNull
private String name;
private String value;
getters/setters...
}
и боб, который имеет несколько методов для получения и сохранения этой сущности из базы данных с помощью критериев запроса:
@Stateless
public class SettingRepository {
@Inject
private Logger logger;
@Inject
private EntityManager entityManager;
public Setting findByName(@NotNull String name) {
logger.trace("Getting setting by name: name=" + name);
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Setting> cq = cb.createQuery(Setting.class);
Root<Setting> table = cq.from(Setting.class);
cq.where(cb.equal(table.get(Setting_.name), name));
TypedQuery<Setting> query = entityManager.createQuery(cq);
List<Setting> results = query.getResultList();
Setting setting = null;
if (results.size() > 0)
setting = results.get(0);
logger.trace("Got setting: " + setting);
return setting;
}
...
}
I wan't предоставить EntityManager
и Logger
экземпляров через @Producer в приложении, которое включает эту банку в classpath следующим образом:
@Produces @DataSource1 @PersistenceContext(unitName = "pu1")
private EntityManager entityManager1;
@Produces @DataSource2 @PersistenceContext(unitName = "pu2")
private EntityManager entityManager2;
@Produces
private Logger produceLogger(InjectionPoint injectionPoint) {
return LogManager.getLogger(injectionPoint.getMember().getDeclaringClass().getName());
}
Есть ли способ сконфигурировать SettingRepository в точке инъекции и указать ему, чтобы использовать конкретный менеджер объектов (или @DataSource2
)?
Подобно этому:
@Inject @DataSource1
private SettingRepository settingRepository;
Спасибо, но в первый раз, когда я знаю, какой источник данных мне нужен, находится в точке инсталляции 'SettingsRepository', а не в точке интуиции EntityManager. Поэтому мне было интересно, есть ли способ «передать» квалификаторы от родительской точки инъекции («НастройкиRepository») до точки инъекции ребенка («EntityManager») или лучше использовать параметры для каждого метода. – scetix