EntityManager immer Null

Lucifer002

Grünschnabel
Hallo zusammen,

ich bin gerade dabei mich in EJB3 einzuarbeiten und irgendwie komme ich nicht voran.

Ich habe ein Stateless Session Bean welches mit @PersistenceContext einen EntityManager haben sollte, jedoch ist dieser immer leer und ich bekomme am Client eine NullPointerException

Code:
11:59:16,336 INFO  [EJBContainer] STARTED EJB: at.janubis.ServerBean ejbName: Server
11:59:16,368 INFO  [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:

        janubis.Server - EJB3.x Default Remote Business Interface
        janubis/Server/remote-at.janubis.Server - EJB3.x Remote Business Interface

11:59:16,415 INFO  [SessionSpecContainer] Starting jboss.j2ee:ear=janubis.ear,jar=janubis.server.jar,name=UserCluster,se
rvice=EJB3
11:59:16,430 INFO  [EJBContainer] STARTED EJB: at.janubis.bean.UserDAOBean ejbName: UserCluster
11:59:16,446 INFO  [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:

        janubis.User - EJB3.x Default Remote Business Interface
        janubis/UserCluster/remote-at.janubis.bean.UserDAO - EJB3.x Remote Business Interface
        janubis/UserCluster/local - EJB3.x Default Local Business Interface
        janubis/UserCluster/local-at.janubis.bean.UserDAOLocal - EJB3.x Local Business Interface

Das Interface
Code:
package at.janubis.bean;

import java.rmi.Remote;
import java.util.List;

import at.janubis.entity.User;

public interface UserDAO extends Remote 
{
	/** Removes this Cluster Instance */
	public void close();
	/** Store User */
	public void store();
	/** Cancel changes */
	public void cancel();
	/** Load User */
	public User getUser(String name);
	/** Load User */
	public User getUser(long id);
	
	/** Sets User Object */
	public void setUser(User user);
	
	/** Returns List of Users */
	public List<User> getUsers();
	/** Returns List of Users */
	public List<User> getUsers(List<String> condition);
	
}

Die Beanklasse
Code:
package at.janubis.bean;

import java.io.Serializable;
import java.util.List;

import javax.annotation.Resource;
import javax.ejb.Local;
import javax.ejb.Remote;
import javax.ejb.Remove;
import javax.ejb.SessionContext;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NamedQuery;
import javax.persistence.PersistenceContext;

import at.janubis.EJBConstants;
import at.janubis.entity.User;
import at.janubis.util.Logging;

@Stateless(name=EJBConstants.USER_CLUSTER_NAME, mappedName="janubis.User")
@Remote(UserDAO.class)
@Local(UserDAOLocal.class)
//@Interceptors(UserDAOCallback.class)
@NamedQuery(name="User.findByName", query="SELECT u FROM User u WHERE u.name LIKE :name")
public class UserDAOBean implements UserDAO, UserDAOLocal, Serializable 
{
	private static final long serialVersionUID = -8723547684825655263L;
	
	@PersistenceContext(name=EJBConstants.PERSISTENCE_CONTEXT_NAME)
//	@PersistenceUnit(name=EJBConstants.PERSISTENCE_CONTEXT_NAME)
	private EntityManager em;
	
	@Resource private SessionContext sessionContext;
	
	
	public UserDAOBean() {
		super();
	}

	public void cancel() {
		em.clear();
	}
	
	public void setEntityManager(EntityManager em){
		Logging.getLogger(getClass()).info("Get EntityManager: "+em);
		this.em = em;
	}
	public EntityManager getEnityManger(){
		return em;
	}
	
	@Remove
	public void close() {
		Logging.getLogger(getClass()).info("REMOVE()");
		cancel();
	}

	public User getUser(String name) 
	{
		return (User)em.createNamedQuery("User.findByName").setParameter("name", name).getSingleResult();
	}

	public User getUser(long id) 
	{
		return (User)em.find(User.class, id);
	}

	public List<User> getUsers() {
		return (List<User>)em.createQuery("SELECT u FROM User u ").getResultList();
	}

	public List<User> getUsers(List<String> condition_) {
		StringBuilder sb = new StringBuilder().append("SELECT u FROM User u WHERE u.id = > -1 ");
		String[] condition = condition_.toArray(new String[]{});
		for(String cond : condition){
			sb.append("AND ").append(cond).append(" ");
		}
		
		return (List<User>)em.createQuery(sb.toString()).getResultList();
	}

	public void store() {
		return;
	}

	public void setUser(User user) {
		if(null != user)
			em.merge(user);
	}

}

meine application.xml
Code:
<application>
   <display-name>EJB3 Ear janbuis</display-name>

   <module>
      <ejb>janubis.server.jar</ejb>
   </module>
</application>

jboss-app.xml
Code:
<jboss-app>
  <loader-repository>
    janubis:archive=janubis.ear
  </loader-repository>
</jboss-app>

persistence.xml
Code:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" 
	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">
	<persistence-unit name="janubis" transaction-type="JTA">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<jta-data-source>java:/DefaultDS</jta-data-source>
		<properties>
			<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
            <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
            <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup"/>
        </properties>

	</persistence-unit>
</persistence>

client
Code:
package at.janubis.test;

import java.util.Properties;

import javax.naming.Context;
import javax.naming.InitialContext;

import at.janubis.bean.UserDAO;
import at.janubis.entity.User;
import at.janubis.util.Logging;

public class Main 
{
	private static final Logging logging = Logging.getLogger(Main.class);
	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		logging.info("Starting....");
		if (System.getSecurityManager() == null) {
		      System.setSecurityManager(new java.rmi.RMISecurityManager());
		}
		Context ctx;
		Properties properties = new Properties();
		properties.put("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
		properties.put("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");
		properties.put("java.naming.provider.url","jnp://localhost:1099");
		ctx = new InitialContext(properties);

		UserDAO uc = null;
			
		Object o = ctx.lookup("janubis.User");
		System.out.println(o.getClass());
		uc = (UserDAO)o; //PortableRemoteObject.narrow(o,UserDAO.class);
		
		//Hier wird eine NullPointerException geworfen
		//Caused by: java.lang.NullPointerException
		//		 at at.janubis.bean.UserDAOBean.getUsers(UserDAOBean.java:69)
		//
		System.out.println(java.util.Arrays.toString(uc.getUsers().toArray()));
		
		User u = new User();
		u.setId(1);
		u.setName("Matthias");
		u.setDisplay("Matthe");
		u.setPassword("hallo");
		uc.setUser(u);
		uc.store();
		
		System.out.println(java.util.Arrays.toString(uc.getUsers().toArray()));
		uc.close();
		
	}
}

Das ganze ist bei mir in einer EAR-Datei, welche die janubis.server.jar beinhaltet. Verwenden tu ich jetzt den JBoss5.0.1GA - default
Ich komme absolut nicht drauf was es da haben sollte :(

Hoffe es weiß jemand Rat und schon mal vielen Dank!
LG Lucifer
 
Zuletzt bearbeitet:
Zurück