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