【问题标题】:Object null at Entity's @Override Equals Method实体的 @Override Equals 方法中的对象 null
【发布时间】:2013-03-28 18:54:35
【问题描述】:

我目前正在开发我公司的一个项目。我使用 JSF 和 PrimeFaces。根据项目要求,我使用 PrimeFaces SelectOneMenu 来显示员工列表,如下所示...

<p:selectOneMenu id="employee" value="#{employeeBean.employee}"
converter="employeeConverter">
    <f:selectItem itemLabel="" itemValue="" />
    <f:selectItems value="#{employeeBean.employeeList}" var="emp"
    itemLabel="#{emp.name}" itemValue="#{emp}" />
</p>

这是我的 Employee 对象的 Equals 方法...

@Override
public boolean equals(Object obj) {
    if (!(obj instanceOf Employee)) {
        return false;
    }
    Employee employee = (Employee) obj;
    return this.id.equals(employee.getId());
}

如果我在Employee Bean init Method @PostConstruct public void init(){}创建员工对象Employee employee = new Employee();,则this所代表的员工对象变为null。如果我不创建员工对象,一切正常。为什么?我不知道。非常感谢您的帮助!

【问题讨论】:

  • this 变量永远不会是 null,但 this.id 可能是 null 在您构造实例之后但在您为 id 赋值之前。
  • @CharlesForsythe 感谢您的评论! :-)

标签: java jsf primefaces nullpointerexception


【解决方案1】:

这一行,

return this.id.equals(employee.getId());

不是 null 安全的。当idnull 时,它仍然会抛出NPE,当您使用new 运算符手动创建实体实例而不设置其任何属性而不是通过JPA 方式从数据库获取实例时,可能会出现这种情况。相应地修复它:

return id != null ? id.equals(employee.id) : employee == this;

请注意,我还通过添加employee == this 提高了比较的自反性。另请参阅contract of equals() 的第一点。

【讨论】:

  • 感谢您的回复。你的意思是如果我们手动创建实体实例,它就不能接受来自数据库的实例了吗?
  • 哦!我仍然混淆了这个逐步的程序。 this 表示此条件下实例来自数据库?
  • this 代表当前实例。所以,Employee e = new Employee(); boolean equal = e.equals(e); 以这种方式返回 true。没有它,它将返回不合逻辑的 false。
  • 好的!我懂了!谢谢你的回答,我很感激! :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 2011-11-26
  • 2021-12-17
  • 2011-12-08
  • 2012-12-07
  • 1970-01-01
  • 2011-09-09
相关资源
最近更新 更多