java.lang.IllegalStateException:Bean'...'已被取消部署

时间:2014-05-03 00:19:37

标签: java ejb dao tomee openejb

我使用Apache Tomee+ 1.5.0eclipseMySql 5.6.17

我为用户提供了一些简单的注册表单,并检查此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;
            }

    }
}

在课程User中,我有NamedQuery

@NamedQuery(name = "findByEmail", query = "SELECT u FROM User u WHERE u.emailAddress like :email")

最后,有一个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;

我在其中检查电子邮件是否已与此代码一起使用:

if(userDao.findByEmail(email)!=(null)){
  //notify user that email is already used
}
else {
    //create new User
    userDao.persist(user);
}

首次注册效果很好,在数据库中保存并且一切正常,但如果我尝试注册下一个用户,则会出现此错误:

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)

我将代码剥离到最大,但我认为其余的servlet代码不是必需的,因为第一次注册是正常的。

编辑:这是GenericDaoBean类:

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();
}

}

1 个答案:

答案 0 :(得分:0)

切换到apache-tomee-plus-1.6.0后,我摆脱了这个错误。