#jakarta-ee #annotations #jndi #lookup #ejb-3.1
#Джакарта-ee #примечания #jndi #поиск #ejb-3.1
Вопрос:
У меня есть веб-проект с несколькими EJB в другом пакете. Однако у меня возникла проблема с поиском EJB.
Моя структура каталогов: есть два пакета index.job и index.ejb.
— у package index.job есть POJO index.java
— индекс пакета.ejb имеет ejb, определенный @Stateless(name = «indexEJB», mappedName = «indexEJB») и @LocalBean
— package index.ejb также имеет локальный интерфейс ejb, определенный @Local
Мой локальный компонент
package index.ejb;
import java.util.ArrayList;
import javax.ejb.Local;
@Local
public interface IndexEJBLocal {
public ArrayList getLatestVersions(String year, int start, int end);
}
Мой EJB
package index.ejb;
import javax.ejb.Stateless;
import javax.annotation.Resource;
import javax.ejb.LocalBean;
@Stateless(name = "indexEJB", mappedName = "indexEJB")
@LocalBean
public class IndexEJB implements IndexEJBLocal {
@Resource(lookup = "jdbc/cap")
private DataSource ds;
@Override
public ArrayList getLatestVersions(String year, int start, int end) {
return null;
}
}
Мой POJO
//ADDED @ManagedBean ANNOTATION SO SERVER IDENTIFIES THIS OBJ AS A RESOURCE
//Also cannot use @PostConstruct as the execute method is overridden from quartz job interface
package index.job;
import javax.annotation.ManagedBean;
import javax.ejb.EJB;
import javax.inject.Inject;
@ManagedBean
public class IndexJob implements Job {
@EJB
IndexEJB billIndexEJB1;
@EJB
IndexEJBLocal billIndexEJB2;
@Inject
IndexEJB billIndexEJB3;
@Inject
IndexEJBLocal billIndexEJB4;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("1::" billIndexEJB1); //ALWAYS NULL
System.out.println("2::" billIndexEJB2); //ALWAYS NULL
System.out.println("3::" billIndexEJB3); //ALWAYS NULL
System.out.println("4::" billIndexEJB4); //ALWAYS NULL
try {
Context ctx = new InitialContext();
IndexEJBLocal billIndex = (IndexEJBLocal)
ctx.lookup("java:global.MY-PROJECT-NAME.IndexEJB!index.ejb.IndexEJBLocal");
//ABOVE LOOKUP ALWAYS FAILS WITH NameNotFoundException
System.out.println("billIndex::" billIndex);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Любые подсказки о том, как это можно решить, будут высоко оценены.
Мой проект запущен на: NetBeans 8.2; JDK 1.8b45; Java EE 7 Web; WebLogic 12.2.1.1
Комментарии:
1. Какая у вас проблема? Ошибка поиска контекста? Если да, попробуйте просмотреть журнал запуска, если он правильно развернут, веб-логика должна сообщить вам имя JNDI, для которого может быть вызван EJB.
2. Спасибо! Я просмотрел журнал запуска, и это помогло. Мне пришлось обновить путь поиска до java:module/IndexEJB!index.ejb.IndexEJB и удалить интерфейсы.
Ответ №1:
Всякий раз, когда вы аннотируете компонент как @LocalBean, заставляя компонент отображать представление без интерфейса, ссылка, возвращаемая поиском, будет ссылкой на класс EJB, а не на интерфейс. Аннотация @LocalBean предоставляет все методы в реализации EJB, а не только методы, определенные в интерфейсе.
Исключение, которое вы получаете, вероятно, говорит вам, что нет компонента с IndexEJBLocal view .
Ваше самое простое решение — удалить аннотацию @LocalBean, которая, я полагаю, является тем, что вы хотите.
Комментарии:
1. Спасибо! Я удалил интерфейсы и напрямую инициализировал EJB с помощью поиска. Однако мне пришлось обновить путь поиска до java:module/IndexEJB!index.ejb.IndexEJB