Announcement

Collapse
No announcement yet.

EJB Stateful Zustand

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • EJB Stateful Zustand

    Hallo Community,

    ich bin ein Anfänger in J2EE und probiere gerade mich mit SessionBeans auseinander zusetzen. Ich habe dabei probiert ein simples Beispiel zu programmieren.

    Code:
    @Stateful
    public class ServerService implements IServer {
    	private ServiceLocator sLocator = ServiceLocator.getInstance();
    	@EJB(name="SessionService") ISessionLocal sessionLocal;
    	@PersistenceContext(unitName="openflowDS")
        private EntityManager em;
        /**
         * Default constructor. 
         */
        public ServerService() {
            // TODO Auto-generated constructor stub
        }
    
    	@Override
    	public ISession login(String user, String pass) {
    		// TODO Auto-generated method stub
    		AccountTO acc = getAccount(user);
    		if(user.equals(acc.getUserid()) && pass.equals(acc.getPassword())) {
    			ISession sessionRemote = sLocator.getSessionRemote();
    			sessionLocal.setAccount(acc);
    			if(sessionLocal.isSessionAvailable()) {
    				return sessionRemote;
    			} else {
    				sessionLocal.setAccount(acc);
    				sessionLocal.createSession();
    				return sessionRemote;
    			}
    		}
    		return null;
    	}
    
    	@Override
    	public void addAccount(String user, String pass) {
    		// TODO Auto-generated method stub
    		AccountTO acc = new AccountTO();
    		acc.setUserid(user);
    		acc.setPassword(pass);
    		em.persist(acc);
    	}
    
    	@Override
    	public List<AccountTO> listUsers() {
    		// TODO Auto-generated method stub
    		Query q = em.createQuery("SELECT x FROM AccountTO x");
    		return q.getResultList();
    	}
    
    	@Override
    	public AccountTO getAccount(String userid) {
    		// TODO Auto-generated method stub
    		Query q = em.createQuery("SELECT x FROM AccountTO x WHERE x.userid='"+userid+"'");
    		return (AccountTO) q.getResultList().get(0);
    	}
    In der Methode "login" setze ich in der 2.Stateful SessionBean eine Variable = AccountTO. Was ich nicht verstehen kann wenn ich dann die Abfrage mache "sessionLocal.isAvailable()" in der das Object AccountTO aufgerufen wird, erhalte ich den Wert NULL! Entweder ich verstehe die Technology noch nicht oder hier ist irgendwo der wurm drin?!

    Code:
    package com.openflow.session;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.List;
    
    import javax.ejb.Stateful;
    import javax.persistence.EntityManager;
    import javax.persistence.PersistenceContext;
    import javax.persistence.Query;
    
    import com.openflow.dto.AccountTO;
    import com.openflow.dto.SessionTO;
    import com.openflow.tools.Common;
    import com.openflow.tools.IDProducter;
    
    /**
     * Session Bean implementation class SessionService
     */
    @Stateful
    public class SessionService implements ISession, ISessionLocal {
    	@PersistenceContext(unitName="openflowDS")
        private EntityManager em;
    	private SimpleDateFormat sdf = new SimpleDateFormat(Common.OPENFLOW_FORMAT);
    	private IDProducter id = new IDProducter();
        private AccountTO account = null;
    	
    	public SessionService() {
            // TODO Auto-generated constructor stub
        }
    
    	@Override
    	public void createSession() {
    		// TODO Auto-generated method stub-
    		try {
    			if(account!=null) {
    				SessionTO sesEntity = getSessionByEntity();
    				if(sesEntity==null) {
    					this.createSessionTO();
    				} else {
    					if(!isSessionAvailable()) {
    						this.createSessionTO();
    					}
    				}
    			}
    		} catch(Exception e) {
    			e.printStackTrace();
    		}		
    	}
    	private void createSessionTO() {
    		SessionTO session = new SessionTO();
    		session.setUserId(account.getUserid());
    		session.setSessionId(id.getID());
    		
    		Date date = new Date();
    		session.setSessionStart(sdf.format(date));
    		
    		long now = date.getTime();
    		Date sessionEnd = new Date();
    		sessionEnd.setTime(now+Common.OPENFLOW_SESSION_DURATION);
    		
    		session.setSessionEnd(sdf.format(sessionEnd));
    		
    		em.persist(session);
    	}
    
    	@Override
    	public boolean isSessionAvailable() {
    		// TODO Auto-generated method stub
    		try {
    			SessionTO sessionEntity = getSessionByEntity();
    			
    			if(sessionEntity!=null) {
    				Date now = new Date();
    				Date start = sdf.parse(sessionEntity.getSessionStart());
    				Date end = sdf.parse(sessionEntity.getSessionEnd());
    				
    				if(now.after(start) && now.before(end)) {
    					return true;
    				} else {
    					if(sessionEntity!=null) {
    						em.remove(sessionEntity);
    					}
    					return false;
    				}
    			}			
    		} catch(Exception e) {
    			e.printStackTrace();
    		}
    		return false;
    	}
    
    	@Override
    	public void setAccount(AccountTO acc) {
    		// TODO Auto-generated method stub
    		this.account=acc;
    	}
    
    	@Override
    	public SessionTO getSessionByEntity() {
    		// TODO Auto-generated method stub
    		if(account!=null) {
    			Query q = em.createQuery("SELECT x FROM SessionTO x WHERE x.userId='"+account.getUserid()+"'");
    			if(q.getResultList().size()==0) {
    				return null;
    			}
    			return (SessionTO) q.getResultList().get(0);
    		} else {
    			throw new RuntimeException("No account defined!");
    		}
    	}
    
    	@Override
    	public AccountTO getAccount() {
    		// TODO Auto-generated method stub
    		return account;
    	}
    }
    Die Stateful SessionBean speichert einfach nicht mein AccountTO object ab?!

    Wäre nett wenn mir jemand helfen könnte

    Mfg mavinatic

  • #2
    Da hier keine Antwortet auf diese Frage antwortet, habe ich ein simpleres Problem bzw es ist das gleiche nur es ist simpler dargestellt.

    Ich übergebe in der Methode login, nach der Validierung ob der Benutzername und Password stimmt die UserId in die LocalBean des IServiceManager's (Zeile 8).
    Code:
    @Override
    	public IServiceManager login(String user, String pass) {
    		// TODO Auto-generated method stub
    		IServiceManager serviceManagerRemote = sLocator.getServiceManagerRemote();
    		
    		AccountTO acc = getAccount(user);
    		if(user.equals(acc.getUserid()) && pass.equals(acc.getPassword())) {
    			local.setUser(acc.getUserid());
    			return serviceManagerRemote;
    		}
    		return null;
    	}
    In diesem ServiceManager rufe ich in einer RemoteMethode die Methode getUser() auf, welcher mir IMMER den Rückgabewert NULL zurück gibt.
    Code:
    @Stateful
    public class ServiceManager implements IServiceManager,IServiceManagerLocal {
    	String userid;
        public ServiceManager() {
            // TODO Auto-generated constructor stub
        }
    
    	@Override
    	public IMail getMailService() {
    		// TODO Auto-generated method stub	
    		ServiceLocator service = ServiceLocator.getInstance();
    		return service.getMailRemote();
    	}
    
    	@Override
    	public void setUser(String userid) {
    		// TODO Auto-generated method stub
    		this.userid=userid;
    	}
    
    	@Override
    	public String getUser() {
    		// TODO Auto-generated method stub
    		return this.userid;
    	}
    An dieser Stelle frage ich mich, was mache ich falsch? Ich benutze eine StatefulSB, welche den Zustand über mehrere Methodenaufrufe hinweg speichert.

    Gruß
    George

    Comment

    Working...
    X