2

我目前正在开发我公司的一个项目。我使用 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 employee = new Employee();在 Employee Bean init Method 处创建员工对象@PostConstruct public void init(){},则表示的员工对象this变为 null。如果我不创建员工对象,一切正常。为什么?我不知道。非常感谢你的帮助!

4

1 回答 1

4

这条线,

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

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

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

请注意,我还通过添加employee == this. 另请参阅合同equals()的第一点。

于 2013-03-28T19:21:24.183 回答