App auf EJB Stateless Beans umstellen - NPE

Dieses Thema App auf EJB Stateless Beans umstellen - NPE im Forum "Application Tier" wurde erstellt von membersound, 24. Jan. 2012.

Thema: App auf EJB Stateless Beans umstellen - NPE Hallo, ich versuche gerade mein funktionierendes App auf EJB + SessionBeans umzustellen, mit Hilfe von...

  1. Hallo,

    ich versuche gerade mein funktionierendes App auf EJB + SessionBeans umzustellen, mit Hilfe von Annotations.
    Beim Programmstart wird eine bestehende Database mit findAll() ausgelesen. Und dort tritt dann eine NPE auf.
    Habe ich etwas vergessen bei der Umstellung?
    Im Grunde muss ich doch nur die Annotations @EJB und @Stateless setzen?

    Danke

    Code (Java):
    public class Controller {

        @EJB
        private PersonDao personDao;

    //business methods
    }

    @Stateless
    public class PersonDao {
        @PersistenceContext
        private EntityManager em;

        public List<Person> findAll() {
            return em.createQuery("select p from Person p").getResultList(); //<- NPE
        }

        /* not needed anymore if EJB implemented
        public HolidayModelDao() {
                emf = Persistence.createEntityManagerFactory("TestDB");
            em = emf.createEntityManager();
        }*/


    }

     
    Code (Java):
     
     
  2. Vielleicht hilft dir das Grundlagen Training weiter --> *Klick*
  3. Zuletzt bearbeitet: 25. Jan. 2012
  4. Ändert sich nichts, gibt exakt die selbe Fehlermeldung.
    Auch wenn ich HibernateEntityManager statt EntityManager verwende. Keine Chance.
     
  5. Ich glaube, dass meine Dao im Controller null ist und die EX auslöst. Zumindest schlägt der Unit test fehlt, wenn ich die Dao versuche über get() auszulesen.


    Code (Java):
    @JpaEntityManagerFactory(persistenceUnit = "TestDB")
    public class ControllerTest extends UnitilsJUnit4 {
       
        @TestedObject
        Controller ctrService;
       
        @Test
        public void shouldCheckCRUD() {
            assertNotNull(ctrService.getPersonDao()); //NPE
        }
    }
     
    Vielleicht fehlt mir ja noch etwas grundsetzliches, im Hinblick auf meinen Code im Eingangsposting?

    Im Controller habe ich halt nur die Dao mit @EJB annotiert.
    Reicht das vielleicht nicht, um mit dieser zu arbeiten?

    Code (Java):
    public class Controller {
     
        @EJB
        private PersonDao personDao;

        public PersonDao getPersonDao() {
            return personDao;
        }
     
        public List<Person> getPersons() {
        return personDao.findAll(); //Ex
        }
    }


    Oder funktioniert mein Ansatz gar nicht mit einer Desktop Application, und die Sachen die ich mache sind WebApps vorbehalten?
    Ich möchte halt primär DependencyInjection und Transactional für meine Desktop App nutzen, um die nervigen Sachen etwas zu vereinfachen...
     
    Zuletzt bearbeitet: 25. Jan. 2012
  6. Die Klasse Kontrolle ist ja nur ein POJO, das nicht im Container verwaltet wird. Deshalb funktioniert die EJB-Annotation auch nicht. Du müsstest das also mit einem JNDI lookup machen, um an das Dao zu kommen. Oder du annotierst den Controller auch als Stateless Bean. (zumindest soweit ich das beurteilen kann, aber bin selbst recht neu in der Thematik :))
     
  7. Kostenloses Java-Grundlagen Training im Wert von 39 €
    Schau dir jetzt hier das Tutorial an und starte richtig durch!