문제

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.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top