2012-04-18 89 views
2

我使用JBoss 6.1决赛,并获得我的Web应用程序后,以下错误消息运行一段时间(注意应用程序不会崩溃),其次是一个很长的堆栈跟踪。我注意到这个问题只发生在有状态会话bean被注入到其中的有状态会话bean中。钝化问题有状态会话Bean

16:10:59769 ERROR [org.jboss.ejb3.cache.simple.SimpleStatefulCache.UutSerialNumberServiceBean]问题钝化螺纹:javax.ejb.EJBException异常:无法钝化;未能保存状态

这里是有问题的有状态会话bean ...

package com.ray.TEI.ejb; 

import java.io.Serializable; 

import javax.ejb.Stateful; 
import javax.inject.Inject; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
import javax.persistence.PersistenceContextType; 

import com.ray.TEI.model.TestProcedure; 
import com.ray.TEI.model.Uut; 
import com.ray.TEI.model.UutSerialNumber; 

@Stateful 
public class UutSerialNumberServiceBean implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @PersistenceContext(unitName="jasoni", type=PersistenceContextType.EXTENDED) 
    protected EntityManager em; 
    @Inject private ExecProcedureServiceBean execProcedureServiceBean; 

    public boolean isDuplicateSerialNumber(Uut uut, String serialNumber) { 
    return ((Number)em.createNamedQuery("UutSerialNumber.getCountByUutIdAndSerialNumber") 
      .setParameter("uut", uut) 
      .setParameter("serialNumber", serialNumber) 
      .getSingleResult()).intValue() > 0; 
    } 

    public UutSerialNumber findUutSerialNumberByUutSerialNumberId(Integer uutSerialNumberId) { 
    return em.find(UutSerialNumber.class, uutSerialNumberId); 
    } 

    public UutSerialNumber editSerialNumber(Integer uutSerialNumberId, String serialNumber) { 
    UutSerialNumber uutSerialNumber = findUutSerialNumberByUutSerialNumberId(uutSerialNumberId); 
    uutSerialNumber.setSerialNumber(serialNumber); 
    return uutSerialNumber; 
    } 

    public UutSerialNumber createSerialNumber(Uut uut, String serialNumber) { 
    UutSerialNumber uutSerialNumber = new UutSerialNumber(); 
    uutSerialNumber.setSerialNumber(serialNumber); 
    uutSerialNumber.setUut(uut); 
    uut.getSerialNumbers().add(uutSerialNumber); 
    em.persist(uutSerialNumber); 
    for (TestProcedure testProcedure : uut.getTestProcedures()) { 
     execProcedureServiceBean.createExecProcedure(uutSerialNumber, testProcedure); 
    } 
    return uutSerialNumber; 
    } 
} 

这里是注入有状态会话bean ...

package com.ray.TEI.ejb; 

import java.io.Serializable; 

import javax.ejb.Stateful; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
import javax.persistence.PersistenceContextType; 

import com.ray.TEI.model.ExecProcedure; 
import com.ray.TEI.model.TestProcedure; 
import com.ray.TEI.model.UutSerialNumber; 


@Stateful 
public class ExecProcedureServiceBean implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @PersistenceContext(unitName="jasoni", type=PersistenceContextType.EXTENDED) 
    protected EntityManager em; 

    public ExecProcedure createExecProcedure(UutSerialNumber uutSerialNumber, TestProcedure testProcedure) { 
    ExecProcedure execProcedure = new ExecProcedure(); 
    execProcedure.setUutSerialNumber(uutSerialNumber); 
    execProcedure.setTestProcedure(testProcedure); 
    execProcedure.setIterationCount(0); 
    em.persist(execProcedure); 
    return execProcedure; 
    } 
} 

人知道什么不对的?

感谢, 杰森

回答

1

EntityManageris not serializable,我想这就是为什么它失败。

从这里的选项夫妇:

  • 停用钝化
  • 从SFSB删除持久化上下文(这很可能会杀了你的扩展模式)(如果你不需要这种机制最简单的选项)
  • 与Hibernate会话,这序列化替换的EntityManager(考虑到实验性的,我从来没有尝试过了我自己)
+0

感谢月我试图使用 停用钝化“@CacheConfig(MAXSIZE = 0,idleTimeoutSeconds = 0)” ,现在有不同的问题。我将这些有状态会话Bean注入到RequestScoped支持bean中以加载视图数据,现在看起来即使注入了一个对象(例如,打印出的参考给出了 “端口[jboss的无接口视图.j2ee:?罐子= TEI.war,名称= ProgramServiceBean,服务= EJB3]和会话43g443f-ep5eqs-h1822776-1-h18233w9-DF” - 但是,方法对象调用不工作任何想法 谢谢再次!杰森 – JasonI 2012-04-19 17:03:38

+0

不同的问题 - >新的问题... :)这是更容易处理。 – 2012-04-19 20:56:29

+0

好的,会发布它! – JasonI 2012-04-19 21:44:41