h: selectOneMenu не работает с jsf2 - PullRequest
1 голос
/ 27 июня 2011

Недавно мы перешли на jboss-6.0.0. Наконец, с richfaces-3.3.3.Final и jsf-2.0. После развертывания мы обнаружили, что <h:selectOneMenu/> не работает должным образом, если selectItems имеет атрибут noSelectionLabel, даже если <s:convertEnum/> передается компоненту. Например

        <h:selectOneMenu id="gender" value="#{user.gender}">
            <s:selectItems noSelectionLabel="Select Gender"/>
            <f:selectItems value="#{user.genderTypes}" />
            <s:convertEnum />
        </h:selectOneMenu>


public Map<String, Gender> getGenderTypes() {
    Gender[] values = Gender.values();
    Map<String, Gender> genderTypes = new LinkedHashMap<String, Gender>(values.length);

    for (Gender gender : values) {
        genderTypes.put(gender.toString(), gender);
    }

    return genderTypes;
}

Если значение не указано для этого элемента, на странице отправки я получаю сообщение об ошибке,

"Константа" Выберите пол "не найдена на enum Gender "

. Затем я проанализировал JSF 2, инициализированный под Mojarra-2.0. Я изменил это на Mojarra-1.2 в web.xml, как это

<context-param>
      <param-name>org.jboss.jbossfaces.JSF_CONFIG_NAME</param-name>
      <param-value>Mojarra-1.2</param-value> </context-param>

После этого я получаю ошибку развертывания

вызвано: java.lang.NoClassDefFoundError: орг / RichFaces / контекст / PartialViewConextImpl

Мой web.xml

<?xml version="1.0" ?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    version="2.5">

    <!-- RichFaces -->

    <context-param>
        <param-name>org.richfaces.SKIN</param-name>
        <param-value>blueSky</param-value>
    </context-param>

    <!-- Suppress spurious stylesheets -->

    <context-param>
        <param-name>org.richfaces.CONTROL_SKINNING</param-name>
        <param-value>enable</param-value>
    </context-param>

    <context-param>
        <param-name>org.richfaces.CONTROL_SKINNING_CLASSES</param-name>
        <param-value>enable</param-value>
    </context-param>

    <!-- Added to force facelets to ignore comments -->

    <context-param>
        <param-name>facelets.SKIP_COMMENTS</param-name>
        <param-value>true</param-value>
    </context-param>

    <!--
        Change load strategy to DEFAULT to disable sending scripts/styles as
        packs
    -->

    <context-param>
        <param-name>org.richfaces.LoadStyleStrategy</param-name>
        <param-value>ALL</param-value>
    </context-param>

    <context-param>
        <param-name>org.richfaces.LoadScriptStrategy</param-name>
        <param-value>ALL</param-value>
    </context-param>

    <!-- Seam -->

    <listener>
        <listener-class>org.jboss.seam.servlet.SeamListener</listener-class>
    </listener>

    <servlet>
        <servlet-name>Seam Resource Servlet</servlet-name>
        <servlet-class>org.jboss.seam.servlet.SeamResourceServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>Seam Resource Servlet</servlet-name>
        <url-pattern>/seam/resource/*</url-pattern>
    </servlet-mapping>

    <filter>
        <filter-name>Seam Filter</filter-name>
        <filter-class>org.jboss.seam.servlet.SeamFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>Seam Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- Facelets development mode (disable in production) -->

    <context-param>
        <param-name>facelets.DEVELOPMENT</param-name>
        <param-value>false</param-value>
    </context-param>

    <!-- JSF -->

    <context-param>
        <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
        <param-value>.xhtml</param-value>
    </context-param>

    <!-- Session Timeout -->

    <context-param>
        <param-name>org.ajax4jsf.handleViewExpiredOnClient</param-name>
        <param-value>true</param-value>
    </context-param>

    <context-param>
        <param-name>org.ajax4jsf.DEFAULT_EXPIRE</param-name>
        <param-value>86400</param-value>
    </context-param>

    <!-- This param is needed to change the JSF configuration of our WAR -->
    <context-param>
          <param-name>org.jboss.jbossfaces.JSF_CONFIG_NAME</param-name>
          <param-value>Mojarra-1.2</param-value>
     </context-param>

    <!-- Faces servlet -->

    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.seam</url-pattern>
    </servlet-mapping>

    <security-constraint>
        <display-name>Restrict raw XHTML Documents</display-name>
        <web-resource-collection>
            <web-resource-name>XHTML</web-resource-name>
            <url-pattern>*.xhtml</url-pattern>
        </web-resource-collection>
        <auth-constraint />
    </security-constraint>

    <session-config>
        <session-timeout>20</session-timeout>
    </session-config>

</web-app>

Как решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 27 июня 2011

Начиная с JSF 1.2, есть встроенный преобразователь перечисления . Вам не нужен пользовательский конвертер. Чтобы представить выбор по умолчанию без значения, просто используйте <f:selectItem> без itemValue. Кроме того, поскольку JSF 2.0 вам больше не обязательно нужны SelectItem[], List<SelectItem> или Map<K, V> для <f:selectItems>. Также поддерживается T[] или List<T>. Есть даже атрибут var, так что метка и значение элемента могут быть установлены со свойствами T.

Итак, это представление:

<h:selectOneMenu value="#{bean.gender}" required="true">
    <f:selectItem itemLabel="Select gender" />
    <f:selectItems value="#{bean.genders}" />
</h:selectOneMenu>

с этой моделью:

private Gender gender; // +getter +setter

public Gender[] getGenders() {
    return Gender.values();
}

должно работать хорошо, без особых хлопот.

0 голосов
/ 27 июня 2011

Я заметил это также при немного других обстоятельствах.Если вы явно назначите конвертер для элемента данных и в качестве значения будете иметь значение null (noSelecrtion), то по какой-то странной причине он отправит метку вместо значения конвертеру.Я обхожу проблему, используя атрибут forClass @FacesConverter, или используя конвертеры JSF по умолчанию (перечисление enum работает нормально для меня).

...