Проблема:
Привет, у меня проблема с java EE, я должен использовать аннотацию, такую как @Inject @Stateless и т. д., но я не могу найти решение, после прочтения большого количества документации и примеров и т. д. кажется, что мой код должен работать, но точно нет. Итак, проблема в том, что у меня есть пользовательские квалификаторы на интерфейсе, подобном этому
@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface BudgetsDs {
}
и я хочу ввести его в другой объект как поле члена, подобное этому
@Dependent
public class BudgetService {
@BudgetsDs
@Inject
DataSource budgetsDS;
... some getter, setter , etcetc...
}
я прошел через это
https://docs.oracle.com/javaee/6/tutorial/doc/gjbck.html
и другой вид документации, подобный этому. Я пробовал с @EJB, @Stateless, но это не работает. Я думаю, что в настоящее время мне не хватает большой вещи в аннотации, поэтому, если у вас есть хорошие учебные пособия, хорошие советы или объяснения, я хочу их услышать. Я не прошу полного ответа, но я хотел бы иметь хоть какую-то подсказку. Любой может помочь.
Изменить: точная ошибка указана в строке
@BudgetsDs
@Inject
DataSource budgetsDS;
BudgetDS бросает неудовлетворенную зависимость: ни один bean-компонент не соответствует точке внедрения
Edit2: решение
1) Я реализовал новый класс ResourceProducer. Как предложил Джон Амент, я использую @Produces и @Resource(name="jdbc/myDataSource") для каждого источника данных, который мне нужен.
public class ResourceProducer {
@Produces
@BudgetsDs
@Resource(name="jdbc/BudgetsDs")
public DataSource budgetsDs;
@Produces
@OtherDs
@Resource(name="jdbc/OtherDs")
public DataSource otherDs;
...
}
2) Различные настраиваемые квалификаторы для каждого подключения
// In a file
@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface BudgetsDs {
}
// In a another file
@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface OtherDs {
}
3) Таким образом, вставка работает хорошо, и я могу внедрить другой источник данных, куда захочу, например:
@Dependent
public class BudgetService {
@BudgetsDs
@Inject
DataSource budgetsDS;
@OtherDs
@Inject
DataSource otherDs;
... some getter, setter , etcetc...
}
Ниже приведено другое решение, которое тоже работает.
Спасибо aribeiro и John Ament. Мой первый вопрос о переполнении стека, на который очень хорошо ответило сообщество.
DataSource
аннотация@BudgetsDs
? - person aribeiro   schedule 22.04.2016DataSource
, вам также необходимо поместить свой квалификатор в реализацию. Если вы заметили, в упомянутой вами ссылке квалификатор@Informal
помещается в начало классаInformalGreeting
. Затем, как вы можете видеть в docs.oracle.com/javaee/6 /tutorial/doc/gjban.html, в классеPrinter
вводится приветствие:@Inject @Informal Greeting greeting;
. - person aribeiro   schedule 22.04.2016@Inject
компонент. - person aribeiro   schedule 22.04.2016DataSource
, в связи с тем, что мне понадобится доступ к разным базам данных. Поэтому я должен использовать настраиваемые квалификаторы для реализации различных подключений, у меня также есть класс ResourceProducer, который получит@Resource
- person Koraxos   schedule 22.04.2016DataSource
. Взгляните на ответ, который я опубликовал. - person aribeiro   schedule 22.04.2016DataSource
— это просто источник данных JDBC, то, что вы здесь делаете, должно работать. Можете ли вы включить полную трассировку стека NPE, который вы получаете? - person John Ament   schedule 23.04.2016