2013-07-16 6 views
0

Я пытаюсь реализовать одноэлементный класс, который управляет свойствами из моей базы данных. Тем не менее, я получаю исключение nullPointerException, когда я пытаюсь ввести свой бэнд базы данных. Вот мой код:NullPointerException при инъекции EJB в JBoss

import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

import javax.ejb.EJB; 
import javax.ejb.Stateless; 
.. 

@Stateless 
public class Properties { 

    public static volatile Properties instance; 
    private static Map<String, String> properties = new HashMap<String, String>(); 

    @EJB(WHAT_TO_DO_HERE) 
    private DatabasePersisterLocal databasePersister; 

    public static Properties getInstance() { 
     if (instance == null) { 
      synchronized (Properties.class) { 
       if (instance == null) { 
        instance = new Properties(); 
       } 
      } 
     } 

     return instance; 
    } 

    private Properties() { 
     System.out.println("starting"); 
     System.out.println(databasePersister); //null 

     //initializing 
    } 
} 

Я экспортирует свой проект в банке, а потом, когда я пытаюсь получить экземпляр Properties, я получаю, что starting распечатаны, а затем в nullPointerException. Когда я пытаюсь ввести тот же EJB (DatabasePersisterLocal) из моего другого проекта, я не получаю ошибки. Что я делаю не так?

+0

вам нужно указать EJB, который вы хотите ввести в 'WHAT_TO_DO_HERE', назвать целевой компонент с именем и указать его здесь. –

+0

Но я успешно ввел «DatabasePersisterLocal» в свой проект, используя только аннотацию '@ EJB'? –

+0

это тоже иждивенцы к реализации слишком чувак, иногда в некоторых средах вам нужно называть их :) –

ответ

0

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

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

Однако, если вы используете EJB 3.1, можно использовать аннотацию @Singleton, которая указывает контейнеру, который должен создать только один экземпляр EJB.