EJB не "виден" менеджеру EJB. Невозможно использовать CDI или JNDI для ссылки на него - PullRequest
2 голосов
/ 29 декабря 2011

У меня возникла странная проблема, которая внезапно возникла, когда я пытался создать новый EJB и внедрить его в другой EJB, чтобы я мог вызывать его ресурсы.Я использую Glassfish 3.1 и Java EE 6.

Я делал это пару раз без проблем в одном и том же проекте, но по какой-то причине этот EJB вызывает ошибки развертывания.Как только я добавлю аннотацию

@ EJB EJBname ejbname;

К бобу, в котором я хочу сослаться на него и сохранить, я получаю ошибку сервера развертывания.

Журналы сервера показывают:

Причина: javax.naming.NameNotFoundException: com.bob.thrift.ThriftClient # com.bob.thrift.ThriftClient не найден

javax.naming.NamingException: исключение, разрешающее Ejb для 'Remote ejb-ref name = com.bob.logic.RSSbean / tclient, интерфейс Remote 3.x = com.bob.thrift.ThriftClient, ejb-link = null, lookup =, mappedName =, jndi-name = com.bob.thrift.ThriftClient, refType = Session '.Фактическое (возможно внутреннее) имя удаленного JNDI, используемое для поиска: 'com.bob.thrift.ThriftClient # com.bob.thrift.ThriftClient' [Исключением корня является javax.naming.NamingException: поиск не выполнен для ...

Я не знаю, что означает этот хэш-символ # или могу ли я подтвердить, что это правильный синтаксис.Похоже, что это правильный пакет, где мой класс существует, однако.

Я делаю то же самое, что и для других EJB, все они - простые сессионные компоненты @stateless.Это похоже на файл библиотеки, на который есть ссылка, которого нет в пути сборки.Как будто у него есть имя, но он не может найти фактическое местоположение.Я не уверен, как решить эту проблему в случае инъекции EJB.

Редактировать: EJB с необходимым мне материалом: package com.bob.thrift;

import com.bob.thrift.sendEventMessage2;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransportException;

import javax.annotation.ManagedBean;
import javax.ejb.Remote;
import javax.ejb.Local;
import javax.ejb.LocalBean;
import javax.ejb.Singleton;
import javax.ejb.Stateless;

@Stateless
@LocalBean

public class ThriftClient {

public ThriftClient(){} 

public String sendToServer(String say){
    System.out.println("Entering ThriftClient's main method starting server connection...");
    String msg;
    //**Make Socket**
    TSocket socket = new TSocket("137.222.23.23",1111);

    //**Make Buffer**
    //TSocket bufferedSocket = (socket); skipping this step because the jvm already handles
    //the buffering on this end. 

    //**put in protocol**
    TBinaryProtocol protocol = new TBinaryProtocol(socket);
    //**create client to use protocol encoder**
    sendEventMessage2.Client client = new sendEventMessage2.Client(protocol);

EJB с внедрением, которое вызывает ошибки развертывания: package com.bob.logic;

import java.util.List;

import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.jws.WebService;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import com.bob.eao.XRSSeao;
import com.bob.thrift.ThriftClient;


 @Stateless
 @LocalBean
 //@WebService
public class RSSbean {

private String inputString;
private List Statuses;

@EJB private ThriftClient tclient;

Как только я добавлю вышеупомянутую строку "@EJB ThriftClient tclient", она не будет развернута, и я получу NameException, поиск JNDI, сопоставление исключений нулевого типа.Это отказывается быть найденным таким образом.

Ответы [ 2 ]

1 голос
/ 29 декабря 2011

В случае, если другие найдут этот вопрос, важно, чтобы вы не думали, что определение интерфейса требуется в Java EE 6 и EJB 3.1. Представление NO-интерфейса допускает определения без интерфейсов.

1 голос
/ 29 декабря 2011

Я не уверен, что вы правильно сделали с вашим ejbName.Предположим, у вас есть следующий bean-компонент:

@Stateless
public class MrBean implements MrBeanInterface {}

Затем вам нужно добавить в bean-компонент аннотацию @EJB следующим образом:

@EJB
private MrBeanInterface mrBean;

Обратите внимание, что класс MrBeanInterface, а неMrBean напрямую.В качестве альтернативы, если вы используете CDI и у вас есть 2 реализации для одного и того же интерфейса, вы также можете внедрить bean-компонент следующим образом:

@Stateless
public class MrBean  implements BeanInterface {}

@Stateless
public class MrsBean implements BeanInterface {}

@Inject
@Exact(MrBean.class)
private BeanInterface mrBean;

UPDATE 1:

Thisвзято из Учебное пособие Oracle :

  • Клиенты приложений Java EE ссылаются на экземпляры корпоративных бинов, аннотируя статические поля аннотацией @EJB.Аннотированное статическое поле представляет бизнес-интерфейс корпоративного компонента, который преобразуется в экземпляр компонента сеанса, когда контейнер клиента приложения внедряет ссылки на ресурсы во время выполнения.

Относительно What is EJB?, When to use EJB? и Benefits of EJB?, вы можете обратиться к этой статье .

ОБНОВЛЕНИЕ 2:

Согласно вашему обновлению, ваш @LocalBean не имеет никаких интерфейсов.Это могло нарушить спецификации EJB 3.0.В этой документации Oracle они упоминали:

  • При использовании модели программирования EJB 3.0 для программирования bean-компонента требуется для указания бизнес-интерфейса.

Кроме того, в этом учебном пособии от IBM они определили локальный SessionBean без интерфейса следующим образом:

  • Бин не предоставляет никаких другихклиентские представления (локальный, удаленный, 2.x удаленный дом, 2.x локальный дом, веб-служба) и условие его реализации пусто.
  • Боб предоставляет по крайней мере еще один вид клиента,Боб обозначает, что он предоставляет представление без интерфейса с аннотацией @ LocalBean для класса бина или в дескрипторе развертывания.

Короче говоря, я думаю, что вы все равно должны указатьинтерфейс для вашего ThriefClient, даже если вам не нужно его использовать.

@Stateless
@LocalBean
public class ThriefClient implements ThriefInterface {
   // Your  functions
}

@Local
public interface ThriefInterface {
   // Empty interface
}

В качестве альтернативы, в EJB 3.1 вы можете попробовать это:

@Stateless
public class ThriefClient {
   // Your  functions
}

@Stateless
public class RSSbean {
    @EJB
    private ThriefClient thriefClient;
}
...