h: selectOneMenu не заполняет «выбранный» элемент

У меня возникли проблемы с тем, что h: selectOneMenu не имеет выбранного элемента, когда на вспомогательном компоненте уже что-то установлено. Я использую шов и указал конвертер клиента. При работе на моей странице «создание» все работает нормально, что-то из меню можно выбрать, а при отправке страницы правильное значение назначается и сохраняется в базе данных.
Однако, когда я работаю над своим на странице «редактировать» выбор меню по умолчанию не является текущим выбором. Я прошел и подтвердил, что что-то определенно установлено и т. д.

Мой selectOneMenu выглядит так:

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

А преобразователь ниже. Это очень просто и просто превращает идентификатор из строки в 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() в классе (это не сводится к тому, что все остальное работает, но я все равно переопределяю его, как показано ниже, где хэш-код - это просто идентификатор (идентификатор уникальный идентификатор для каждого элемента).

Метод равенства:

@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 показывает, что все сравнения во время построения списка терпят неудачу из-за сравнения с нулевым объектом, но проверка страницы отладки шва показывает, что значение определенно установлено.


person dann.dev    schedule 31.10.2012    source источник
comment
В Omnifaces есть SelectItemConverter, который может решить вашу проблему. showcase-omnifaces.rhcloud.com/showcase/converters/   -  person bhdrkn    schedule 13.11.2012


Ответы (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, который может решить вашу проблему.

person bhdrkn    schedule 02.11.2012
comment
этот метод работает, но он вызывает некоторые проблемы с производительностью, и у меня есть много выпадающих меню на этой странице. - person dann.dev; 04.11.2012