2014-01-20 5 views
1

Это снова,ActionListener не работает должным образом с ViewScope?

У меня есть эта проблема, так как переключатель с использованием action до actionListener. Это странная проблема, и я не знаю, почему это произошло.

Когда я попытался удалить элемент из таблицы данных PrimeFaces, Я получу NullPointerException. Но, если я сначала отредактирую этот элемент, а затем вернусь, чтобы удалить, все будет хорошо !?

Я использую actionListener для использования Ajax в JSF. Когда я использовал действие, он все еще работал правильно.

JSF Page

<p:commandButton id="editButton" icon="ui-icon-pencil" 
       value="#{appBundle.Edit}" 
       action="detail.xhtml?faces-redirect=true"> 
    <f:setPropertyActionListener value="#{a}" 
           target="#{academicManagedBean.academicSelected}"/> 
</p:commandButton> 
<p:commandButton id="deleteButton" icon="ui-icon-trash" 
       value="#{appBundle.Delete}" 
       actionListener="#{academicManagedBean.delete}" 
       update=":growl,datalist"> 
    <p:confirm header="Confirmation" message="Are you sure?" icon="ui-icon-alert" /> 
    <f:setPropertyActionListener value="#{a}" 
           target="#{academicManagedBean.academicSelected}" /> 
</p:commandButton> 
<p:confirmDialog global="true" showEffect="fade" hideEffect="explode"> 
    <p:commandButton value="Yes" type="button" 
        styleClass="ui-confirmdialog-yes" icon="ui-icon-check"/> 
    <p:commandButton value="No" type="button" 
        styleClass="ui-confirmdialog-no" icon="ui-icon-close"/>  
</p:confirmDialog> 

Managed Bean Class

@ManagedBean 
@ViewScoped 
public class AcademicManagedBean extends TblAcademic implements Serializable { 

    private List<TblAcademic> all; 
    private static TblAcademic academicSelected; 

    public AcademicManagedBean() { 
     super(); 
    } 

    public List<TblAcademic> getAll() { 
     try { 
      all = new com.rdb.bll.AcademicBLL().getAll(); 
      return all; 
     } catch (Exception ex) { 
      Logger.getLogger(AcademicManagedBean.class.getName()).log(Level.SEVERE, null, ex); 
      return null; 
     } 
    } 

    public void add(ActionEvent actionEvent) throws Exception { 
     boolean check = new com.rdb.bll.AcademicBLL().add(this); 
     if (check) { 
      JsfUtil.addSuccessMessage("Congratulation, new student has been added successfully!"); 
     } else { 
      JsfUtil.addErrorMessage(ResourceBundle.getBundle("com.rdb.service.AppBundle").getString("PersistenceErrorOccured")); 
     } 
    } 

    public void update(ActionEvent actionEvent) throws Exception { 
     boolean check = new com.rdb.bll.AcademicBLL().update(AcademicManagedBean.academicSelected); 
     if (check) { 
      JsfUtil.addSuccessMessage("Congratulation, student has been updated successfully!"); 
     } else { 
      JsfUtil.addErrorMessage(ResourceBundle.getBundle("com.rdb.service.AppBundle").getString("PersistenceErrorOccured")); 
     } 
    } 

    public void delete(ActionEvent actionEvent) throws Exception { 
     boolean check = new com.rdb.bll.AcademicBLL().delete(AcademicManagedBean.academicSelected); 
     if (check) { 
      JsfUtil.addSuccessMessage("Congratulation, student has been deleted successfully!"); 
     } else { 
      JsfUtil.addErrorMessage(ResourceBundle.getBundle("com.rdb.service.AppBundle").getString("PersistenceErrorOccured")); 
     } 
    } 

    public String studentDetail() { 
     TblStudent std = new com.rdb.bll.StudentBLL().getById(AcademicManagedBean.academicSelected.getStudentRollNo()); 
     new StudentManagedBean().setStudentSelected(std); 

     return "/backend/student/detail.xhtml?faces-redirect=true"; 
    } 

    public String getClassNameById(int classId) { 
     TblClass objClass = new com.rdb.bll.ClassBLL().getById(classId); 
     return objClass.getClassName(); 
    } 

    public TblAcademic getAcademicSelected() { 
     return academicSelected; 
    } 

    public void setAcademicSelected(TblAcademic academicSelected) { 
     AcademicManagedBean.academicSelected = academicSelected; 
    } 

ли я сделать что-нибудь не так? Пожалуйста, помогите мне сделать это правильно, спасибо.

ответ

2
<p:commandButton id="deleteButton" icon="ui-icon-trash" 
       value="#{appBundle.Delete}" 
       actionListener="#{academicManagedBean.delete}" 
       update=":growl,datalist"> 
    <p:confirm header="Confirmation" message="Are you sure?" icon="ui-icon-alert" /> 
    <f:setPropertyActionListener value="#{a}" 
           target="#{academicManagedBean.academicSelected}" /> 
</p:commandButton> 

вы выполняете удаление в actionListener метода вместо метода действия. Это неправильно. Бизнес-действия должны выполняться в методе action. Все действия listeners, включая <f:setPropertyActionListener>,, вызываются до action в том же порядке, в каком они объявлены и назначены в командном компоненте. Таким образом, в эффектах сначала вызывается удаление, а затем устанавливается свойство. Это объясняет, почему свойство null при удалении.

Исправления проста: сделать его метод реального действия:

<p:commandButton id="deleteButton" icon="ui-icon-trash" 
       value="#{appBundle.Delete}" 
       action="#{academicManagedBean.delete}" 
       update=":growl,datalist"> 
    <p:confirm header="Confirmation" message="Are you sure?" icon="ui-icon-alert" /> 
    <f:setPropertyActionListener value="#{a}" 
           target="#{academicManagedBean.academicSelected}" /> 
</p:commandButton> 

Не забудьте удалить ActionEvent аргумент:

public void delete() { 
    // ... 
} 

Это извлекается из Ответа отправленного JSF Гуру Balcus здесь Posted by JSF Guru

+0

не понимаю. Внутри страницы подробностей или добавления новой страницы я тоже использую 'actionListener', и он все еще работает нормально. Во всяком случае, ваше решение решило мою проблему. Спасибо вам. –

+0

Если это помогло, то примите это как ответ. – Makky

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