2011-06-27 6 views
1

最近、私たちはjboss-6.0.0に移行しました.FinalとRichFaces.3.3.3.Finalとjsf-2.0。デプロイメント後、selectItemsに 'noSelectionLabel'という属性がある場合、<s:convertEnum/>がコンポーネントに渡されても、<h:selectOneMenu/>が正しく動作していないことがわかりました。値がこの要素に提供されていない場合の例h:selectOneMenuはjsf2と連携していません

 <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; 
} 

については、ページ

"Constant 'Select Gender' is not found on enum Gender"

ことを、私はエラーを取得しています提出します。 次に、JSF 2がMojarra-2.0で初期化されていると分析しました。私は、展開エラー

Caused by: java.lang.NoClassDefFoundError: org/richfaces/context/PartialViewConextImpl

私のweb.xmlを取得しています。この後、この

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

のようにweb.xmlにクロサギ科-1.2にこれを変更し

<?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

JSF 1.2以降、builtin enum converterがあります。カスタムコンバータは必要ありません。値なしでデフォルト選択を表すには、itemValueのない<f:selectItem>を使用してください。また、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

明示的なenumコンバーターを使用せずに列挙型で正常に動作しようとしましたが、エンティティの問題は、 Achaius

0

私はこれもわずかに異なる状況で気づきました。入力エレメントに明示的にコンバータを割り当て、値がnull(noSelecrtion)の場合は、値の代わりにラベルをコンバーターに送信するという奇妙な理由があります。 @FacesConverterのforClass属性を使用するか、またはJSFデフォルトコンバータを使用して問題を回避します(enumは私にとって問題ありません)。

関連する問題