I use Apache Tomee+ 1.5.0
, eclipse
and MySql 5.6.17
.
I have some simple registration form for users, and I check if email is already used in this DAO:
@Stateless
@Local(UserDaoLocal.class)
public class UserDaoBean extends GenericDaoBean<User, Integer> implements UserDaoLocal{
@Override
public User findByEmail(String email){
try{
Query q = em.createNamedQuery("findByEmail");
q.setParameter("email", email);
return (User) q.getSingleResult();
}catch(NoResultException e){
return null;
}
}
}
In class User
I have this NamedQuery
:
@NamedQuery(name = "findByEmail", query = "SELECT u FROM User u WHERE u.emailAddress like :email")
And finally, there is a servlet RegisterServlet
:
public class RegisterServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static Logger log = Logger.getLogger(RegisterServlet.class);
@EJB
private UserDaoLocal userDao;
in which I check if email is already used with this code:
if(userDao.findByEmail(email)!=(null)){
//notify user that email is already used
}
else {
//create new User
userDao.persist(user);
}
First registration works good, gets persisted in database and everything is OK, but if I try to register next user, it gives me this error:
java.lang.IllegalStateException: Bean 'UserDaoBean' has been undeployed.:
org.apache.openejb.core.ivm.BaseEjbProxyHandler.getBeanContext(BaseEjbProxyHandler.java:563)
org.apache.openejb.core.ivm.BaseEjbProxyHandler.isValidReference(BaseEjbProxyHandler.java:321)
org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:219)
com.sun.proxy.$Proxy75.findByEmail(Unknown Source)
servlet.RegisterServlet.doPost(RegisterServlet.java:138)
javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929) org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
java.lang.Thread.run(Thread.java:745)
I stripped the code to maximum, but I think rest of servlet code is not necessary as the first registration is OK.
EDIT: Here is the GenericDaoBean
class:
public abstract class GenericDaoBean<T, ID extends Serializable> implements GenericDaoLocal<T, ID> {
private Class<T> entityType;
@PersistenceContext(unitName = "mbs2")
protected EntityManager em;
@SuppressWarnings("unchecked")
public GenericDaoBean() {
entityType = (Class<T>) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
}
public Class<T> getEntityType() {
return entityType;
}
public T findById(ID id) {
T entity;
entity = em.find(entityType, id);
return entity;
}
@SuppressWarnings("unchecked")
public List<T> findAll() {
Query q = em.createQuery("SELECT x FROM " + entityType.getSimpleName()
+ " x");
List<T> result = q.getResultList();
return result;
}
@SuppressWarnings("unchecked")
public List<T> findBy(String query) {
Query q = em.createQuery(query);
List<T> result = q.getResultList();
return result;
}
public T persist(T entity) {
em.persist(entity);
return entity;
}
public T merge(T entity) {
entity = em.merge(entity);
return entity;
}
public void remove(T entity) {
entity = em.merge(entity);
em.remove(entity);
}
public void flush() {
em.flush();
}
public void clear() {
em.clear();
}
}
I got rid of this error after switching to apache-tomee-plus-1.6.0.