2016-10-07 10 views
0

У меня есть веб-проект с несколькими EJB в другой упаковке. Однако у меня проблема с поиском EJB.Вопрос поиска EJB

Моя структура каталогов: есть два пакета index.job и index.ejb.

- пакет index.job имеет POJO index.java

- пакет index.ejb имеет EJB, определяемый @Stateless (имя = "indexEJB", mappedName = "indexEJB") и @LocalBean

- пакет index.ejb также имеет локальный интерфейс EJB определен @LOCAL

My Local Bean

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. – Leonardo

+0

Спасибо! Я заглянул в журнал запуска, и это помогло. Мне пришлось обновить путь поиска к java: module/IndexEJB! Index.ejb.IndexEJB и удалить интерфейсы. –

ответ

2

Всякий раз, когда вы комментируете bean-компонент как @LocalBean, делая объект bean открытым видом без интерфейса, ссылка, возвращаемая поиском, будет ссылкой на класс EJB, а не на интерфейс. Аннотации @LocalBean раскрывают все методы в реализации EJB, а не только методы, определенные в интерфейсе.

Исключение, которое вы получаете, вероятно, говорит вам, что нет компонента с представлением IndexEJBLocal.

Ваше самое простое решение - удалить аннотацию @LocalBean, которая, я считаю, является тем, что вы хотите.

+0

Спасибо! Я удалил интерфейсы и напрямую инициализировал EJB с помощью поиска. Однако мне пришлось обновить путь поиска к java: module/IndexEJB! Index.ejb.IndexEJB –