Передача значения Enum в качестве параметра из JSF (пересмотрено) - PullRequest
3 голосов
/ 27 июня 2011

Передача значения Enum в качестве параметра из JSF

Этот вопрос уже имеет отношение к этой проблеме, однако предлагаемое решение для меня не сработало.Я определяю следующее перечисление в своем компоненте поддержки:

public enum QueryScope {
  SUBMITTED("Submitted by me"), ASSIGNED("Assigned to me"), ALL("All items");

  private final String description;

  public String getDescription() {
    return description;
  }

  QueryScope(String description) {
    this.description = description;
  }
}

Затем я использую его как параметр метода

public void test(QueryScope scope) {
  // do something
}

И использую его через EL на моей странице JSF

<h:commandButton
      id        = "commandButton_test"
      value     = "Testing enumerations"
      action    = "#{backingBean.test('SUBMITTED')}" />

Пока все хорошо - идентично проблеме, поставленной в оригинальном вопросе.Однако мне приходится иметь дело с javax.servlet.ServletException: Method not found: %fully_qualified_package_name%.BackingBean.test(java.lang.String).

Так что, похоже, JSF интерпретирует вызов метода так, как если бы я хотел вызвать метод со String в качестве типа параметра (который, конечно, не существует) -следовательно, неявное преобразование не происходит.

Что может быть фактором, отличающим поведение в этом примере от вышеупомянутого?

1 Ответ

5 голосов
/ 22 декабря 2011

В вашем backingBean вы могли написать метод с параметром enum:

<!-- This won't work, EL doesn't support Enum: -->
<h:commandButton ... action="#{backingBean.test(QueryScope.SUBMITTED)}" />

// backingBean:
public void test(QueryScope queryScope) {
    // your impl
}

Но proposed solution не использует enum, он использует String. Это потому, что EL вообще не поддерживает enum:

<!-- This will work, EL does support String: -->
<h:commandButton ... action="#{backingBean.test('SUBMITTED')}" />    

// backingBean:
public void test(String queryScopeString) {
    QueryScope queryScope = QueryScope.valueOf(queryScopeString);
    // your impl
}
...