Проблема внедрения зависимости Java - PullRequest
1 голос
/ 02 мая 2011

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

В любом случае, ниже это просто простая функция, которую я просто хотел использовать, чтобы опробовать функцию 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");
    }
}

Ответы [ 5 ]

1 голос
/ 02 мая 2011

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

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

0 голосов
/ 04 мая 2011

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

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

0 голосов
/ 02 мая 2011

Не уверен насчет 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");
    }
}
0 голосов
/ 02 мая 2011

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

0 голосов
/ 02 мая 2011

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

...