Primefaces: setPropertyActionListener. Параметр получает нулевое значение

У меня есть dataGrid, который повторяет список объектов. В каждой сетке у меня есть commandButton и тег, который пытается поместить идентификатор объекта, выбранного в компоненте поддержки, но когда действие выполняется, а также в методе установки свойства, значение равно null.

Вот мой код:

<p:dataGrid var="element" value="#{CentroController.profiles}" columns="3"  
 rows="10" paginator="true" paginatorTemplate="{CurrentPageReport} {FirstPageLink}  {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" > 
     <p:panel header="#{CentroController.getDescripcionRoot(element)}" style="text-align:center">  
     <h:panelGrid columns="2" style="width:100%">  

         <p:panel>
             <p:commandButton value="Borrar perfil" icon="ui-icon-trash" update=":form:tabView:profileButtonPanel" action="#{CentroController.deletePerfil}"> 
                 <f:setPropertyActionListener value="#{element.id}" target="#{CentroController.selectedItemId}" />
             </p:commandButton>
          </p:panel>
      </h:panelGrid>  
     </p:panel> 
</p:dataGrid>

В фоновом компоненте:

public void deletePerfil()
{
    System.out.println("SELECTED ITEM ID: " + this.selectedItemId);
     // selectedItemID is always null
}

Когда вызывается сеттер, значение также равно нулю:

public void setSelectedItemId(BigDecimal selectedItemId) {

    System.out.println(selectedItemId); // Value is null
    this.selectedItemId = selectedItemId;
}

Спасибо.

Редактировать: код бина (я удалил ненужные методы).

/* imports */

@Named("CentroController")
@SessionScoped

public class CentroController implements Serializable{

private @Inject CentrosDAO dao;
private @Inject CentrosCanalesDAO daoServicios;
private @Inject CatalogoCentrosLaboratorioDAO habitualLabDAO;
private @Inject CatalogoCentrosRadiologiaDAO habitualRadDAO;

private List<Centros> centros;  
private Centros selectedCentro;
private List<CentrosCanales> selectedCanales=new ArrayList<CentrosCanales>();

private List<CentrosCanales> listado;  
private CentrosCanales selected;
private CatalogoCentros selectedItem;
private BigDecimal selectedItemId;
private TreeNode root;
private DualListModel<Catalogo> listCatalogo;
private DualListModel <Catalogo> listCatalogoLabHabitual;
private DualListModel <Catalogo> listCatalogoRadHabitual;

private CatalogoCentros perfilNuevo=new CatalogoCentros();
private @Inject CentrosCanalesDAO consulta;
private @Inject CatalogoCentrosDAO consulta1;
private @Inject CatalogoDAO consulta2;

private boolean servicioIsSelected; //, perfilIsSelected, pruebaIsSelected;

private List<CatalogoCentros> profiles;

public CentroController() { 
}

@PostConstruct
public void init(){
    this.centros=dao.obtenListaCentros();
    servicioIsSelected = false;
    //perfilIsSelected = false;
}

public BigDecimal getSelectedItemId() {
    return selectedItemId;
}

public void setSelectedItemId(BigDecimal selectedItemId) {

    System.out.println(selectedItemId);
    this.selectedItemId = selectedItemId;
}

public void deletePerfil()
{
    System.out.println("SELECTED ITEM ID: " + this.selectedItemId);
}
}

ОБНОВЛЕНО

DataGrid находится внутри тега rowExpansion в таблице данных. Я понял, что если я помещу dataGrid снаружи, а не вложен в таблицу данных, это сработает. Но я хочу, чтобы это было в rowExpansion.

Это работает только в том случае, если я помещаю сетку данных за пределы tabView, в который включен.


person dhalfageme    schedule 29.08.2013    source источник
comment
Используйте <h:outputText value="ID: #{element.id}"/>, чтобы проверить, действительно ли значение равно null.   -  person user1983983    schedule 29.08.2013
comment
Я уже пробовал это, значение является ожидаемым значением. Спасибо   -  person dhalfageme    schedule 29.08.2013
comment
Комментарий: Bean находится в SessionScoped.   -  person dhalfageme    schedule 29.08.2013
comment
Пожалуйста, опубликуйте код Bean.   -  person user1983983    schedule 29.08.2013
comment
---------------- Отредактировано!   -  person dhalfageme    schedule 29.08.2013
comment
Попробуйте следующее: измените deletePerfil на deletePerfil(CatalogoCentros), удалите setPropertyActionListener и используйте action="#{CentroController.deletePerfil(element)}" и посмотрите, даст ли это желаемые результаты.   -  person user1983983    schedule 29.08.2013
comment
Я уже пробовал это, и параметр снова равен нулю: S.   -  person dhalfageme    schedule 29.08.2013


Ответы (1)


Некоторые вопросы о CatalogoCentros:

  1. Является ли поле id BigDecimal?
  2. Вы переопределили hashCode и equals?

Если «нет» на вопрос 2, сделайте что-то вроде этого:

@Override
public int hashCode() {
    return (id != null) ? id.intValue() : 0;
}

@Override
public boolean equals(final Object obj) {
    if (obj instanceof CatalogoCentros) {
        CatalogoCentros item = (CatalogoCentros) obj;
        return item.getId().equals(getId());
    }

    return false;
}

Установите точку останова в методе equals и посмотрите, не сработает ли он, когда вы выберете что-то в dataGrid.

person jekennedy    schedule 30.08.2013
comment
Привет. 1. Да, id — это BigDecimal. 2. Нет. Я переопределил их сейчас, и метод equals не срабатывает, когда я нажимаю кнопку commandButton (сетка данных не выбирается). Я пробовал использовать идентификатор и весь объект в качестве параметра метода, и это тоже не сработало. Спасибо. - person dhalfageme; 02.09.2013