Entity的@Override Equals方法中的Object null

时间:2013-03-28 18:54:35

标签: java jsf primefaces nullpointerexception

我目前正在开发我公司的一个项目。我使用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>

这是我的员工对象的等于方法...

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

如果我在Employee Bean初始化方法Employee employee = new Employee();创建员工对象@PostConstruct public void init(){},则this表示的员工对象将变为空。如果我不创建员工对象,一切正常。为什么?我不知道。非常感谢你的帮助!

1 个答案:

答案 0 :(得分:4)

这一行,

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

不是空的安全。当idnull时,它仍会抛出NPE,这可能是您使用new运算符手动创建实体实例而不设置其任何属性而不是从中获取实例的情况DB由JPA表示。相应地修复它:

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

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