我使用Apache Tomee+ 1.5.0
,eclipse
和MySql 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();
}
}
答案 0 :(得分:0)
切换到apache-tomee-plus-1.6.0后,我摆脱了这个错误。