我目前正在开发我公司的一个项目。我使用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
表示的员工对象将变为空。如果我不创建员工对象,一切正常。为什么?我不知道。非常感谢你的帮助!
答案 0 :(得分:4)
这一行,
return this.id.equals(employee.getId());
不是空的安全。当id
为null
时,它仍会抛出NPE,这可能是您使用new
运算符手动创建实体实例而不设置其任何属性而不是从中获取实例的情况DB由JPA表示。相应地修复它:
return id != null ? id.equals(employee.id) : employee == this;
请注意,我还通过添加employee == this
来提高比较的反身性。另请参阅contract of equals()
的第一点。