f: viewparam не установлен в bean-компоненте

У меня есть список объектов, и каждая запись имеет ссылку на подробное представление объекта. Код для ссылки

<h:link outcome="#{detailViewPageName}" rendered="#{listRow.rowData.dbId != null}">
     <f:param name="faces-redirect" value="true" />
     <f:param name="phoneNr" value="#{listRow.rowData.phoneNr}" />
     <f:param name="fromDate" value="#{listRow.rowData.fromDate}" />
     <f:param name="toDate" value="#{listRow.rowData.toDate}" />
       #{listRow.rowData.phoneNr == "-1" ? msg.subscriptionPhoneNumberUnknown : listRow.rowData.phoneNr}
</h:link>

и экс. результирующей ссылки:

http://bla-bla.bla/cmn-web/view/cmn/billDetailView.xhtml?faces-redirect=true&phoneNr=41798009726&fromDate=2013-01-01&toDate=2013-01-31

Bean-компонент для подробного представления имеет параметры, определенные с помощью геттеров и сеттеров, а на странице также определен параметр f:viewparam:

<ui:define name="metadata">
   <f:metadata>
      <f:viewParam name="phoneNr" value="#{billDetailController.model.phoneNr}"/>
      <f:viewParam name="fromDate" value="#{billDetailController.model.fromDate}"/>
      <f:viewParam name="toDate" value="#{billDetailController.model.toDate}"/>

      <f:event listener="#{billDetailController.selectData}" type="preRenderView" />
   </f:metadata>
</ui:define>

Проблема в том, что значения в детализированном компоненте никогда не устанавливаются...

Теперь то, что я вижу с помощью отладчика, заключается в том, что после нажатия на ссылку (и я предполагаю, что до загрузки страницы и вызова метода selectData) вызываются геттеры параметров, но не сеттеры.

Компонент ManagedBean и CustomScoped.

Что мне не хватает?

РЕДАКТИРОВАТЬ:

Бин (очень простой):

@ManagedBean( name = "billDetailModel" )
@ViewScoped
public class BillDetailModel extends DetailModel
{
  private String    phoneNr;
  private Date  fromDate;
  private Date    toDate;

  public String getPhoneNr()
  {
    return phoneNr;
  }

  public void setPhoneNr( String phoneNr )
  {
    this.phoneNr = phoneNr;
  }

  public Date getFromDate()
  {
    return fromDate;
  }

  public void setFromDate( Date fromDate )
  {
    this.fromDate = fromDate;
  }

  public Date getToDate()
  {
    return toDate;
  }

  public void setToDate( Date toDate )
  {
    this.toDate = toDate;
  }
}

person Francesco    schedule 02.12.2013    source источник
comment
Так сложно протестировать предоставленный код. Что произойдет, если вы измените свой компонент на @ViewScoped?   -  person Xtreme Biker    schedule 02.12.2013
comment
С @ViewScoped тоже самое...   -  person Francesco    schedule 02.12.2013
comment
Сделайте привычкой всегда иметь <h:messages> где-то в представлении. В противном случае вы никогда не знаете, что вы пропустите.   -  person BalusC    schedule 02.12.2013
comment
@BalusC Как всегда правильный совет... Conversion Error setting value '2013-01-01' for 'null Converter'. Conversion Error setting value '2013-01-31' for 'null Converter'.   -  person Francesco    schedule 02.12.2013


Ответы (1)


возможно, проверьте, есть ли какие-либо ConverterExceptions во время фазы обновления JSF. Если вы, например. попробуйте установить дату в геттер/сеттер, ожидающий объект даты или календаря, это может не сработать без правильного промежуточного DateConverter.

Надеюсь, это поможет...

person L-Ray    schedule 02.12.2013
comment
Если геттер/сеттер ожидает другой объект, такой как java.util.Date или java.util.Calendar, И для данного класса (@FacesConverter(forClass=YourClassHere.class)) имеется подходящий Faces-Converter. он автоматически преобразуется. Поскольку вы не опубликовали часть управляемого компонента, я просто хотел убедиться, что вы ожидаете там String... :-) - person L-Ray; 02.12.2013
comment
Вы правы, компонент ожидает две даты и строку (см. редактирование в вопросе). Я попробую добавить конвертер и посмотреть, работает ли он... - person Francesco; 02.12.2013