Проблема с поиском EJB

#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