Невозможно ввести локальный EJB. Инъекция зависимости не удалась - PullRequest
0 голосов
/ 30 декабря 2011

Я использую Glassfish 3.1 и JEE6 с EJB3.1.Я просто пытаюсь внедрить один Stateless LocalBean с представлением без интерфейса в другой EJB, чтобы я мог получить доступ к одному из его методов.Но я сразу получаю ошибку развертывания на сайте инъекции.

Если я внедряю его интерфейс @EJB Interface interface;

Невозможно разрешить ссылку Локальное имя ejb-ref = com.sallie.logic.RSSbean / tclient, Локальный интерфейс 3.x =com.eb .thriftEJBinterfaces.thriftEJBinterf * ace, ejb-link = null, lookup =, mappedName =, jndi-name =, r * efType = Session

Если я ввожучерез представление без интерфейса, как в @EJB myBean bean;

  • javax.naming.NamingException: не удалось выполнить поиск для 'java: comp / env / com
  • javax.naming.NamingException: Исключение, разрешающее Ejb для 'Remote ejb-ref
  • javax.naming.NameNotFoundException: c
  • javax.naming.NamingException: не удалось выполнить поиск для' java: comp / env / c

Независимо от того, как я делаю инъекцию, она не работает.У меня есть другие EJB-компоненты, делающие то же самое в этом проекте, которые работают нормально.Мой объект доступа к базе данных использует инъекцию, и он все еще работает.По какой-то причине этот EJB не будет вводить.

Редактировать: объявление класса с аннотацией: (в основном этот класс создает сокет-соединение с внешним сервером не в моем веб-приложении, но доступном по этому адресу с использованием IDL, называемого thrift.Он был протестирован и работает как Java-программа SE (ПРИМЕЧАНИЕ. ОШИБКИ ЖУРНАЛА СЕРВЕРА НЕ УКАЗЫВАЮТ, ЧТО ЭТО ПРОБЛЕМА. ЖУРНАЛ ФАЙЛЫ ПОКАЗЫВАЕТ ИЛИ ИСКЛЮЧЕНИЯ ИМЯ, КАК ЕСЛИ ОНИ НЕ МОГУТ НАЙТИ EJB).

package com.eb.thrift;

import com.eb.thrift.sendEventMessage2;
import com.eb.thriftEJBinterfaces.thriftEJBinterface;

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 = null;
        //**Make Socket**
        TSocket socket = new TSocket("982.222.33.44", 30888);

        //**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);
        //**connect**
        try {
            socket.open();
        } catch (TTransportException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            client.ping();
        } catch (TException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        try {
            msg = client.sayMsg(say);
            return msg;
        } catch (TException e) {
            msg = "response from server failed";
            e.printStackTrace();
        }
        socket.close();
        return msg;
    }
}

Я пробовал это с и без интерфейса, потому что я использую 3.1, я могу использовать представление без интерфейса, и это не решило проблему.

Мне интересно, смогу ли я использоватьнекоторые параметры аннотации для явного задания соответствия и имени, чтобы можно было лучше найти ссылку.

1 Ответ

4 голосов
/ 30 декабря 2011

Я думаю, вы доказали, что, несмотря на то, что в журналах написано, код Thrift является проблемой. Если вы удалите его, инъекция работает; если вы оставите его, инъекция не удастся. Это очень сильно указывает на код Thrift.

Я подозреваю, что это проблема загрузки классов. Сервер приложений не может найти библиотеки Thrift или находит неправильную версию, и в результате класс не загружается или не может быть создан. Этот сбой означает, что EJB не может быть создан, что означает, что поиск завершился неудачей.

Можно ожидать, что лежащее в основе исключение вызывает ошибку, но это может быть ошибка или недосмотр на сервере приложений. Подобные вещи часто бывают удручающе.

Я бы попробовал написать действительно простую тестовую версию EJB, которая делает:

try {
    System.err.println(Class.forName("org.apache.thrift.transport.TSocket"));
}
catch (Exception e) {
    System.err.println(e);
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...