2

バッキング Bean に既に何かが設定されている場合、h:selectOneMenu に選択されたアイテムがないという問題があります。私は seam を使用しており、顧客のコンバーターを指定しています。私の「作成」ページで作業している場合、すべてが正常に機能し、メニューから何かを選択でき、ページが送信されると、正しい値が割り当てられ、データベースにも保持されます。
しかし、「編集」ページで作業しているとき、メニューのデフォルトの選択は現在の選択ではありません。何かが確実に設定されていることなどを確認しました。

私の selectOneMenu は次のようになります。

<h:selectOneMenu id="selVariable" 
     value="#{customer.variableLookup}" 
     converter="#{variableLookupConverter}">
    <s:selectItems var="source" 
        value="#{customerReferenceHelper.variableLookups()}" 
        label="#{source.name}" />
</h:selectOneMenu>

そしてコンバーターは下にあります。それは非常に単純で、id を文字列から int に、またはその逆に変換するだけです。

@Name( "variableLookupConverter" )
public class VariableLookupConverter implements Serializable, Converter {

 @In
 private CustomerReferenceHelper customerReferenceHelper;

 @Override
 public Object getAsObject( FacesContext arg0, UIComponent arg1, String arg2 ) {
    VariableLookup variable= null;
    try {
        if ( "org.jboss.seam.ui.NoSelectionConverter.noSelectionValue".equals( arg2 ) ) {
            return null;
        }
        CustomerReferenceHelper customerReferenceHelper = ( CustomerReferenceHelper ) Contexts.getApplicationContext().get(
                "customerReferenceHelper" );
        Integer id = Integer.parseInt( arg2 );
        source = customerReferenceHelper.getVariable( id );
    } catch ( NumberFormatException e ) {
        log.error( e, e );
    }
    return variable;

 }

 @Override
 public String getAsString( FacesContext arg0, UIComponent arg1, Object arg2 ) {
    String result = null;
    VariableLookup variable= ( VariableLookup ) arg2;
    Integer id = variable.getId();
    result = String.valueOf( id );
    return result;
 }
}

クラスの equals() メソッドである可能性があることについていくつか見てきました (それは他のすべてが機能しているとは言えませんが、以下のようにオーバーライドしました。ハッシュコードは単なる id です (id は各アイテムの一意の識別子)。

等しい方法:

@Override
public boolean equals( Object other ) {
    if ( other == null ) {
        return false;
    }
    if ( this == other ) {
        return true;
    }
    if ( !( other instanceof VariableLookup ) ) {
        return false;
    }
    VariableLookup otherVariable = ( VariableLookup ) other;
    if ( this.hashCode() == otherVariable.hashCode() ) {
        return true;
    }
    return false;
}

私はこれで頭がいっぱいです。見逃していたものを見つけることができませんか?! どんな助けでも大歓迎です。

更新:私が理解しているように、リストが作成されると、バインドされた値が各項目に対してチェックされ、選択された項目を設定するために一致するかどうかが確認されます。equals メソッドにいくつかのデバッグ ステートメントを入れると、null オブジェクトとの比較のためにリストの構築中のすべての比較が失敗することが示されますが、seam デバッグ ページを確認すると、値が確実に設定されていることが示されます。

4

1 に答える 1

1

これを試して;

<h:selectOneMenu id="selVariable" 
 value="#{customer.variableLookup}">
<s:selectItems var="source" 
    value="#{customerReferenceHelper.variableLookups()}" 
    label="#{source.name}" itemValue="#{source}/>
<s:convertEntity />
</h:selectOneMenu>

私はほとんどすべてのエンティティにこの表記法を使用しています。

編集

Omnifaces には SelectItemsConverter があり問題を解決できる場合があります。

于 2012-11-02T15:32:42.757 に答える