f: viewParam с несколькими значениями - PullRequest
5 голосов
/ 17 октября 2011

У меня есть <f:viewParam> управляемый экран поиска.Я пытаюсь реализовать его, чтобы принимать несколько значений для одного <f:viewParam>.

Я считаю, что правильный URL будет выглядеть примерно так:

<url>?state=COMPLETE&state=PENDING

Раздел XHTML выглядит следующим образом:

<f:metadata>
   <f:viewParam name="state"
      value="#{backingBean.state}"
      converter="#{stateNameConverter}" />
</f:metadata>

Я пробовал следующие 2 сигнатуры метода на backingBean:

public void setState(State... state)

Был надежден, что реализация JSF создаст массив для значений и установит на компоненте поддержки.Реализация JSF завершилась ошибкой, указав, что она не может преобразовать перечисление в массив перечислений.

public void setState(State state)

Возможно, реализация JSF установит преобразованные значения в том виде, в котором они нашли их в URL.Было задано только первое значение.

stateNameConverter преобразует значение от String до enum.

Возможно ли иметь несколько значений для <f:viewParam> в JSF 2?

1 Ответ

7 голосов
/ 17 октября 2011

Нет, к сожалению, такого тега как <f:viewParams> нет. Есть также комментарий в реализации UIViewParameter#decode() Мохарры (который является кодом за тегом <f:viewParam>), который подтверждает, что:

@Override
public void decode(FacesContext context) {
    if (context == null) {
        throw new NullPointerException();
    }

    // QUESTION can we move forward and support an array? no different than UISelectMany; perhaps need to know
    // if the value expression is single or multi-valued
    // ANSWER: I'd rather not right now.
    String paramValue = context.getExternalContext().getRequestParameterMap().get(getName());

    // submitted value will stay as previous value (null on initial request) if a parameter is absent
    if (paramValue != null) {
        setSubmittedValue(paramValue);
    }

    rawValue = (String) getSubmittedValue();
    setValid(true);

}

Прямо сейчас ваш лучший способ обойти это, собрав значения самостоятельно из ExternalContext#getRequestParameterValuesMap() в @PostConstruct или <f:viewAction> или, возможно, @ManagedProperty("#{paramValues.state}") в свойстве String[].

Вы также можете создать пользовательский тег <my:viewParams>, который этого добивается, но это не совсем тривиально.

...