Jsf EntityManager上的瞬态导致异常

Jsf EntityManager上的瞬态导致异常,jsf,jpa,jsf-2,facelets,Jsf,Jpa,Jsf 2,Facelets,我正在为我的JSF应用程序使用视图范围的托管bean。由于视图范围的bean需要序列化,所以我实现了Serialiazable。但问题在于EntityManager。我尝试使用transient关键字绕过它,但是我得到了以下异常 我使用了以下bean文件: @ManagedBean @ViewScoped public class StatusBean2 implements Serializable { /** * */ private static

我正在为我的JSF应用程序使用视图范围的托管bean。由于视图范围的bean需要序列化,所以我实现了Serialiazable。但问题在于EntityManager。我尝试使用transient关键字绕过它,但是我得到了以下异常

我使用了以下bean文件:

@ManagedBean
@ViewScoped
public class StatusBean2 implements Serializable  {

    /**
     * 
     */
    private static final long serialVersionUID = -7528998562821856315L;
    private transient EntityManager em;

    public StatusBean2() {
        EntityManagerFactory emf = Persistence
                .createEntityManagerFactory("FreeBird");
        em = emf.createEntityManager();
        FacesContext context = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) context.getExternalContext()
                .getSession(true);
        int toIndex = 5;
       session.setAttribute("toIndex", toIndex);

    }
    public List<Status> getStatusList() {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) context.getExternalContext()
                .getSession(true);
        User user = (User) session.getAttribute("userdet");
        Query query = em.createQuery("SELECT s FROM Status s WHERE s.email='"//  line no 49
                + user.getEmail() + "' ORDER BY s.timeMillis desc",
                Status.class);
        List<Status> results = query.getResultList();
        Query query1 = em.createQuery("SELECT f FROM Friend f WHERE f.email='"
                + user.getEmail() + "'", Friend.class);
        List<Friend> results1 = query1.getResultList();
        Iterator<Friend> it = results1.listIterator();
        while (it.hasNext()) {
            String email = it.next().getFriendEmail();
            Query query2 = em.createQuery(
                    "SELECT s FROM Status s WHERE s.email='" + email
                            + "' ORDER BY s.timeMillis desc", Status.class);
            List<Status> results2 = query2.getResultList();
            results.addAll(results2);

        }
        Collections.sort(results);

        int toIndex = (int) session.getAttribute("toIndex");
        List<Status> subList = results.subList(0, toIndex);

        return subList;

    }
}

反序列化对象时不调用构造函数,因此
transient
字段保留为
null

您需要初始化字段:

@ManagedBean
@ViewScoped
public class StatusBean2 implements Serializable  {
    private static final long serialVersionUID = -7528998562821856315L;
    private transient EntityManager em;
    private static final EntityManagerFactory emf = Persistence.createEntityManagerFactory("FreeBird");

    public StatusBean2() {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) context.getExternalContext()
                .getSession(true);
        int toIndex = 5;
        session.setAttribute("toIndex", toIndex);   
    }

    private EntityManager em() {
        if(em == null)
            em = emf.createEntityManager();
        return em;
    }

    public List<Status> getStatusList() {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) context.getExternalContext()
                .getSession(true);
        User user = (User) session.getAttribute("userdet");
        Query query = em().createQuery("SELECT s FROM Status s WHERE s.email='"//  line no 49
                + user.getEmail() + "' ORDER BY s.timeMillis desc", Status.class);
        List<Status> results = query.getResultList();
        Query query1 = em().createQuery("SELECT f FROM Friend f WHERE f.email='"
                + user.getEmail() + "'", Friend.class);
        List<Friend> results1 = query1.getResultList();
        Iterator<Friend> it = results1.listIterator();
        while (it.hasNext()) {
            String email = it.next().getFriendEmail();
            Query query2 = em().createQuery(
                    "SELECT s FROM Status s WHERE s.email='" + email + 
                    "' ORDER BY s.timeMillis desc", Status.class);
            List<Status> results2 = query2.getResultList();
            results.addAll(results2);
        }
        Collections.sort(results);
        int toIndex = (int) session.getAttribute("toIndex");
        List<Status> subList = results.subList(0, toIndex);
        return subList;
    }
}
@ManagedBean
@视域
公共类StatusBean2实现可序列化{
私有静态最终长serialVersionUID=-7528998562821856315L;
私有瞬态实体管理器em;
私有静态最终EntityManagerFactory emf=Persistence.createEntityManagerFactory(“FreeBird”);
公共状态bean2(){
FacesContext context=FacesContext.getCurrentInstance();
HttpSession会话=(HttpSession)上下文。getExternalContext()
.getSession(true);
int-toIndex=5;
session.setAttribute(“toIndex”,toIndex);
}
私有实体管理器em(){
if(em==null)
em=emf.createEntityManager();
返回em;
}
公共列表getStatusList(){
FacesContext context=FacesContext.getCurrentInstance();
HttpSession会话=(HttpSession)上下文。getExternalContext()
.getSession(true);
User=(User)session.getAttribute(“userdet”);
Query Query=em().createQuery(“从状态s中选择s,其中s.email=”//第49行
+user.getEmail()+“'ORDER BY s.timeMillis desc”,Status.class);
List results=query.getResultList();
Query query1=em().createQuery(“从朋友f中选择f,其中f.email=”)
+user.getEmail()+“”,Friend.class);
List results1=query1.getResultList();
迭代器it=results1.listIterator();
while(it.hasNext()){
字符串email=it.next().getFriendEmail();
Query query2=em().createQuery(
“从状态s中选择s,其中s.email=”+email+
“‘按s.TIMEMILIS desc订购’,状态类);
List results2=query2.getResultList();
结果:addAll(结果2);
}
收集。排序(结果);
intToIndex=(int)session.getAttribute(“toIndex”);
列表子列表=结果。子列表(0,toIndex);
返回子列表;
}
}

异常表示您的对象为空:由以下原因引起:java.lang.NullPointerException您是否调试了
getStatusList()
以查看最后返回的列表是否有内容或为空?尝试一下,然后发布您看到的内容。此外,将UI和后端(甚至是持久性)逻辑保持在同一代码中不是一个好做法。
@ManagedBean
@ViewScoped
public class StatusBean2 implements Serializable  {
    private static final long serialVersionUID = -7528998562821856315L;
    private transient EntityManager em;
    private static final EntityManagerFactory emf = Persistence.createEntityManagerFactory("FreeBird");

    public StatusBean2() {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) context.getExternalContext()
                .getSession(true);
        int toIndex = 5;
        session.setAttribute("toIndex", toIndex);   
    }

    private EntityManager em() {
        if(em == null)
            em = emf.createEntityManager();
        return em;
    }

    public List<Status> getStatusList() {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) context.getExternalContext()
                .getSession(true);
        User user = (User) session.getAttribute("userdet");
        Query query = em().createQuery("SELECT s FROM Status s WHERE s.email='"//  line no 49
                + user.getEmail() + "' ORDER BY s.timeMillis desc", Status.class);
        List<Status> results = query.getResultList();
        Query query1 = em().createQuery("SELECT f FROM Friend f WHERE f.email='"
                + user.getEmail() + "'", Friend.class);
        List<Friend> results1 = query1.getResultList();
        Iterator<Friend> it = results1.listIterator();
        while (it.hasNext()) {
            String email = it.next().getFriendEmail();
            Query query2 = em().createQuery(
                    "SELECT s FROM Status s WHERE s.email='" + email + 
                    "' ORDER BY s.timeMillis desc", Status.class);
            List<Status> results2 = query2.getResultList();
            results.addAll(results2);
        }
        Collections.sort(results);
        int toIndex = (int) session.getAttribute("toIndex");
        List<Status> subList = results.subList(0, toIndex);
        return subList;
    }
}