2015-06-10 34 views
0

我想从数据库中检索找到的对象或null。实体不能为空?

在我ProjectFollowerImpl,为useFollowingProject我返回如果查询不返回任何结果相匹配的查询,或空单实例的方法。

@Override 
public ProjectFollower userFollowingProject(Integer userId, Integer projectId) { 
    return (ProjectFollower) session.createCriteria(classType) 
      .add(Restrictions.eq("user.id", userId)) 
      .add(Restrictions.eq("project.id", projectId)) 
      .uniqueResult(); 
} 
在挂毯页

然后,我有以下方法:

public ProjectFollower getUserFollowingProject() { 
    return projectFollowerDao.userFollowingProject(loggedInUser.getId(), project.getId()); 
} 

@CommitAfter 
void onActionFromFollowProject() { 
    ProjectFollower pf = getUserFollowingProject(); 
    if (pf != null) { 
     projectFollowerDao.delete(pf.getId()); 
    } else { 
     pf = new ProjectFollower(); 
     pf.setProjectId(project); 
     pf.setUserId(loggedInUser); 
     projectFollowerDao.merge(pf); 
    } 
} 

然而,挂毯抛出空指针异常,堆栈跟踪:

com.rile.issuetracker.pages.Tracker getUserFollowingProject() Tracker.java 75 
com.rile.issuetracker.pages.Tracker advised$onActionFromFollowProject_6d8b9673baf() Tracker.java 80 

那么,为什么它是一个问题返回一个空值的对象?我究竟做错了什么 ?

UPDATE:

public class Tracker { 

@Property 
@SessionState 
private User loggedInUser; 

@Property 
@Inject 
private ProjectDao projectDao; 
@Property 
private Project projectP1, project; 
@Property 
private List<Project> projectList; 
@Property 
@Inject 
private ProjectFollowerDao projectFollowerDao; 

@Property 
@Inject 
private TicketDao ticketDao; 
@Property 
private List<Ticket> ticketList; 
@Property 
private Ticket ticketP1; 
@Property 
@Inject 
private TicketFollowerDao ticketFollowerDao; 

@Property 
private Util util = new Util(); 

public boolean getLoggedIn() { 
    return loggedInUser.getEmail() != null; 
}  

@PageLoaded 
void onPageLoad() { 
    projectList = projectDao.loadAll(); 
    ticketList = ticketDao.loadAll(); 
} 

void onActivate(Integer contextValue) { 
    if (contextValue != null) { 
     project = projectDao.getByID(contextValue); 
    } 
    if (project != null) { 
     List ticketListByProjectID = ticketDao.getTicketsByProjectID(project.getId()); 
     if (!ticketListByProjectID.isEmpty()) { 
      ticketList = ticketListByProjectID; 
     } else { 
      ticketList = null; 
     } 
    } 
} 

public ProjectFollower getUserFollowingProject() { 
     return projectFollowerDao.userFollowingProject(loggedInUser.getId(), project.getId());   

} 

@CommitAfter 
void onActionFromFollowProject() { 
    ProjectFollower pf = getUserFollowingProject(); 
    if (pf != null) { 
     projectFollowerDao.delete(pf.getId()); 
    } else { 
     pf = new ProjectFollower(); 
     pf.setProjectId(project); 
     pf.setUserId(loggedInUser); 
     projectFollowerDao.merge(pf); 
    } 
} 

public boolean getIsUserFollowingTicket() { 
    return ticketFollowerDao.isUserFollowingTicket(loggedInUser.getId(), ticketP1.getId()); 
} 

@CommitAfter 
void onActionFromFollowTicket() {} 

public String getActiveFor(String parameter) { 
    if (parameter == null || parameter.isEmpty()) { 
     return null; 
    } 
    switch (parameter) { 
     case "userFollowingProject": 
      return getUserFollowingProject() != null ? "active" : "null"; 
     case "userFollowingTicket": 
      return getIsUserFollowingTicket() ? "anchor-active" : "anchor-inactive"; 
     default: 
      return null; 
    } 
} 

}

+0

它与@Inject annotaion注入。它工作正常。我想我忘了这一个,我应该试试/抓住这个,我会在 – Kapparino

+0

之后尝试这个,你可以发布完整的代码,并显示如何填充'loggedInUser'和'project'变量?在他们中的任何一个都是空的,你可能会抛出NPE – user902383

+0

这一切都很好,期待这种方法。但我会用完整的代码更新我的帖子。 – Kapparino

回答

1

从完整的代码,它看起来像最好的办法是该项目为空,检查完成课后,我们看到它的不注射,和其值仅在onActivate函数中设置,如果contextValue不为null并且projectDao.getByID(contextValue)返回非空值。

能否请您确认在调用之前正确happenning到onActionFromFollowProject

+0

我可以确认,在我调用onActionFromFollowProject之前,项目不是null。 – Xerath

+0

我认为try catch是这里的解决方案,但我不确定我应该在DAO或Tracker页面中验证哪些内容? – Xerath

+0

是另一回事空,你可以调试或使用'System.out.println'检查什么是空,唯一的三件事情,可能会导致NPE是 - 'loggedInUser','project'和'projectFollowerDao' –