Проблема внедрения зависимостей Java

#jakarta-ee #dependency-injection #glassfish #ejb-3.0

#джакарта-ee #внедрение зависимостей #glassfish #ejb-3.0

Вопрос:

Я пробую некоторые функции j2ee, которые поставляются с отражением Java. Поэтому я попробовал поиск в JNDI, который работает без каких-либо проблем, но я также хотел попробовать противоположную версию «Внедрение зависимостей». Однако это сработало не так хорошо, и я также не смог найти причину, почему.

В любом случае, ниже приведена простая функция, которую я просто хотел использовать, чтобы опробовать функцию DI. Однако, когда я скомпилирую его сейчас, я получу Exception in thread "main"java.lang.NullPointerException . Кто-нибудь может увидеть, где я ошибся? Кстати, я использую Glassfish для этого. Итак, развернули файл jar в /<glassfish>/autodeploy folder

Интерфейс

 import javax.ejb.*;
@Remote
public interface Hello {

    public void sayHello(Stiring name);
}
  

Реализация

 import javax.ejb.*;

@Stateless(name = "FooBean", mappedName = "ejb/FooBean")
public class HelloImpl implements Hello {


    @Override
    public void sayHello(String name) {
        System.out.println("Hello "  name);
    }
}
  

Клиент

 import javax.ejb.EJB;
public class ClientTest {
    @EJB
    static Hello bdb;

    public static void main(String args[]) {
        bdb.sayHello("starcorn");
    }
}
  

Ответ №1:

Вы можете внедрять только в управляемый объект. Например, сеансовый компонент без сохранения состояния. В этом случае похоже, что ваш «клиент» не является управляемым объектом.

Если вы действительно хотите пойти по этому пути, вы можете захотеть изучить spring, который позволит вам внедрять в неуправляемые объекты.

Ответ №2:

Возможно, вы пропустили некоторые шаги на этом пути, трудно сказать, учитывая только приведенные выше фрагменты…. Взгляните на это руководство на сайте Netbeans, в нем показана полная процедура.

Комментарии:

1. Я использую eclipse, хотя кажется, что часть настройки более утомительна

Ответ №3:

Не уверен насчет специфики J2EE, но из общего понимания Java вы никогда не инициализируете bdb (bdb = new HelloImpl()). Похоже, вы пытаетесь вызвать нестатический метод для неинициализированной переменной. Если вы сделаете sayHello статичным, вам не нужно будет его инициализировать (или даже объявлять его как элемент).

 public class HelloImpl implements Hello {
    @Override
    public static void sayHello(String name) {
    }
}

public class ClientTest {
    public static void main(String args[]) {
        HelloImpl.sayHello("starcorn");
    }
}
  

Комментарии:

1. нет, это довольно удобная штука 🙂

2. Да, как сказал fvu, я пытаюсь использовать внедрение, поэтому мне не нужно создавать экземпляр

Ответ №4:

Вы не можете запустить основной класс напрямую через Eclipse и все равно получить внедрение зависимостей. Вы должны использовать клиентский контейнер приложения, чтобы получить внедрение.

Комментарии:

1. Да, у меня есть контейнер-клиент приложения. Для этой цели я использую glassfish. Однако как выполнить основную функцию? Поскольку я не могу запустить его, просто создав проект в Eclipse сейчас. Итак, я предполагаю, что мне нужно создать файл jar из моего EJB и клиента, а затем запустить его в контейнере приложений Glassfish, верно?

2. Вы перешли по ссылке? В частности, ссылка «Использование встраиваемого ACC»? download.oracle.com/docs/cd/E18930_01/html/821-2418 /…

Ответ №5:

Привет, я решил проблему. В принципе, я не мог запустить внедрение зависимостей как обычное Java-приложение. Поэтому мне пришлось решить это с помощью appclient от Glassfish.

То, что мне нужно было сделать, это упаковать мой клиент с моим EJB (FooBean) в проект EAR. А затем сгенерируйте из этого Jar-файл. Помимо этого, мне также пришлось специально @EJB переписать его на @EJB(name="beanName", unitName="beanUnitName") более подробно, когда я создавал EAR jar, мне пришлось указать, где находится основной класс.