injizierter EntityManager (Seam) null

thommy.s

Aktives Mitglied
Hallo alle miteinander,

in einer Seam-Anwendung, die auf einem JBoss 5.1 laufen soll, möchte ich die Properies für eine LDAP-Verbindung in der Datenbank speichern und habe dafür eine entsprechende Entity Bean erstellt. Funktioniert soweit.

Problem entsteht, wenn ich versuche, Daten dann zu holen. Für diesen Zweck habe ich den EntityManager in eine Stateless Session bean injiziert, siehe unten:

Java:
/**
 * 
 */
package org.thommys.regusers.session;

import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.jboss.seam.annotations.Name;

/**
 * @author thommy
 *
 */
@Stateless
public class GetLdapPropertiesBean implements GetLdapProperties{
	
		
	@PersistenceContext
	private EntityManager em;	
		
	
	private List<String> propsList;

	@SuppressWarnings("unchecked")
	@Override	
	public List<String> LdapProperties() {
		
		//EntityManager em = emf.createEntityManager();
		
		if(em != null) {
			
	
			propsList = em.createQuery("select l from LDAPProperties l").getResultList();
			
		} else {
			
			System.out.println("EntityManager ist verflixtes Nichts");
		}		
		
		
		return propsList;
	}

}

Nun ja, der injizierte EntityManager ist leider immer null. In anderen Session Beans der gleichen Anwendung funktioniert diese Architektur aber tadellos. Hab's in meiner Verzweiflung sogar im JAVA SE - Style versucht(also Persistence.CretaeEntityManagerFactory() und davon dann den EM abgeleitet). Das will aber der JBoss Application Server nicht, was ich ihm nicht verdenken kann.

Auf weiteren Quelltext (Konfig-Dateien) habe ich erst einmal verzichtet, da ja in anderen Session Beans dieser Weg funktioniert, es also wohl nicht an der Konfiguration liegen kann. Sollte jedoch noch etwas zum Verständnis nötig sein, nur zu und nachgefordert.

Ansonsten freue ich mich über jeden Tipp.

VG Thomas
 
Zuletzt bearbeitet:

thommy.s

Aktives Mitglied
...da wohl niemand was mit meinem Geschreibse anfangen kann, hier nun doch noch die evt. fehlenden Information.

Hier also die persistence.xml:

[XML]
<?xml version="1.0" encoding="UTF-8"?>
<!-- Persistence deployment descriptor for dev profile -->
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">

<persistence-unit name="MeineApp">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>MeineAppDatasource</jta-data-source>
<!-- The <jar-file> element is necessary if you put the persistence.xml in the WAR and the classes in the JAR -->
<!--
<jar-file>../../vehicles.jar</jar-file>
-->
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="jboss.entity.manager.factory.jndi.name" value="java:/MeineAppEntityManagerFactory"/>
</properties>
</persistence-unit>

</persistence>


[/XML]

Außerdem die Datasource-ds.xml:


[XML]

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE datasources
PUBLIC "-//JBoss//DTD JBOSS JCA Config 1.5//EN"
"http://www.jboss.org/j2ee/dtd/jboss-ds_1_5.dtd">
<datasources>

<local-tx-datasource>
<jndi-name>MeineAppDatasource</jndi-name>
<use-java-context>false</use-java-context>
<connection-url>jdbc:hsqldb:.</connection-url>
<driver-class>org.hsqldb.jdbcDriver</driver-class>
<user-name>sa</user-name>
<password></password>
</local-tx-datasource>

</datasources>


[/XML]

wie gesagt, es sei noch einmal darauf hingewiesen, dass es insgesamt mehrere stateless Session Beans gibt, von denen 3 auf die DB zugreifen. 2 davon funktionieren, dabei werden dort die persistiernden Methoden allerdings aus der JSF Oberfläche aufgerufen, bei der 3. erfolgt der Aufruf aus einer normalen Klasse. Vielleicht liegt dort auch der Haken...?
 

der Pragmatiker

Neues Mitglied
Vor zwei Tagen stand ich vor der gleichen Problematik. Nun endlich kurz vor Weihnachten die Lösung. Lass mich noch einmal dein Problem zusammenfassen:
Du möchtes von einer Bean (du sprichst von einer normalen Klasse, bei mir ist es eine Sateful Session Bean) auf eine Andere zugreifen bzw. diese injizieren. Also von einer äußeren Bean auf eine innere Bean. In der inneren Bean benötigst du den Persistenz-Kontext, der dann dummer Weise immer null ist.

Die Lösung:
Du kannst es ganz einfach über @EJB realisieren. Wichtig dabei ist, dass du von der äußeren Bean auf das Interface der inneren Bean referenzierst! In meinem Beispiel auf das Local Interface

Äußere Bean:
Java:
@Stateful
@Scope(ScopeType.CONVERSATION)
@Name("chartPlotter")
public class ChartPlotterBean implements ChartPlotterBeanLocal
{
	
    @PersistenceContext(type=PersistenceContextType.EXTENDED)
    private EntityManager entityManager;
   
    @EJB
    private PlotChartLocal plotChart;  //Referenz auf das Local-Interface der inneren Bean
Innere Bean:
Java:
@Stateful
@Scope(ScopeType.EVENT)
@Name("plotChart")
public class PlotChart implements PlotChartLocal{   
   
    @PersistenceContext(type=PersistenceContextType.EXTENDED)
     private EntityManager entityManager;
Local Interface:
Java:
@Local
public interface PlotChartLocal {
	bla bla bla
}


VG Chrissi


PS: Wenn ich nicht schon so tief in meinem Projekt stecken würde, hätte ich den ganzen Java ... schon längst geschmissen. Die kleinsten Probleme halten dich Tage lang auf. ;(
 

Ähnliche Java Themen


Oben