2013-03-28 3 views
2

Я в настоящее время разрабатываю один из проектов моей компании. Я использую JSF и PrimeFaces. В соответствии с требованиями проекта, я использую PrimeFaces SelectOneMenu, чтобы показать список сотрудников, как в следующем ...Объект null в методе @Override метода Entity

<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 employee = new Employee(); у Employee Bean init Метод @PostConstruct public void init(){}, объект сотрудника, представленный this, становится null. Если я не создаю объект employee, все работает нормально. Зачем? Понятия не имею. Большое вам спасибо за вашу помощь!

+2

Переменная 'this' никогда не является' null', однако 'this.id', вероятно,' null' после создания экземпляра, но до того, как вы присвоите значение 'id'. –

+0

@CharlesForsythe Спасибо за ваш комментарий! :-) –

ответ

4

Эта линия,

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

не пустой сейф. Он по-прежнему будет бросать NPE, когда id равен null, что может быть в случае, когда вы создаете экземпляр объекта вручную с помощью оператора new без установки каких-либо его свойств вместо получения экземпляра из базы данных средствами JPA. Устранить его соответствующим образом:

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

Обратите внимание, что я также улучшенную рефлексивность сравнения путем добавления employee == this. См. Также также первую точку contract of equals().

+0

Спасибо за ваш ответ. Вы имеете в виду, если мы создадим экземпляр объекта вручную, он больше не сможет принять экземпляр, который поступает из БД? –

+0

О! Я все еще путаю эти пошаговые процедуры. 'this' представляет экземпляр, поступающий из БД при этом условии? –

+0

'this' представляет текущий экземпляр. Итак, 'Employee e = new Employee(); boolean equal = e.equals (e); 'возвращает true таким образом. Без этого он вернет ложь, которая нелогична. – BalusC

Смежные вопросы