Rich: select показывает, что значение недопустимо после выбора и преобразования элемента в объект

Я перечисляю коллекцию элементов типа Test (из моего домена) в rich:select, используя следующий код:

test.xtml

<rich:select value="#{testBean.test}" id="cmbTest"
    converter="#{testConverter}" enableManualInput="false">
    <f:selectItems value="#{testBean.all}" var="test" itemLabel="#{test.name}" />
</rich:select>
<rich:message for="cmbTest" />
<h:commandButton id="btnSave" action="#{testBean.save}" value="Save" />

У меня также есть собственный jsf-конвертер для преобразования выбранных строковых значений в объекты типа Test и наоборот:

TestConverter.java

@Component
@Scope("request")
public class TestConverter implements Converter {
    @Override
    public Object getAsObject(FacesContext facescontext, UIComponent uicomponent, String value) {
        if (value == null) return null;
        return new Test(Integer.parseInt(value), "test" + value);
    }

    @Override
    public String getAsString(FacesContext facescontext, UIComponent uicomponent, Object obj) {
        if (obj == null) return null;
        return ((Test) obj).getId().toString();
    }
}

(Как вы могли заметить, я использую Spring) Компонент поддержки для файла xhtml определяется следующим образом:

TestBean.java

@Controller("testBean")
@Scope("session")
public class TestBean {
    private Test test;
    private List<Test> all; 

    public TestBean() {
        all = new ArrayList<Test>();
        for (int i = 0; i < 15; i++) { 
            all.add(new Test(1, String.format("test%d", i)));    
        }
    }

    public Test getTest() {
        return test;
    }

    public void save() {
        System.out.println("Save");
    }

    public List<Test> getAll() {
        return all;
    }
}

Когда я нажимаю кнопку "Сохранить" после выбора действительного элемента, я получаю сообщение об ошибке проверки: "Значение не является допустимым параметром", как показано ниже:

введите здесь описание изображения

Я отладил вызов Converter getAsObject, и он работает нормально, он возвращает действительный экземпляр Test, как и ожидалось (на самом деле, этот «тестовый» проект является изолированным случаем для рабочего проекта, где я впервые обнаружил эту проблему, и в этом проекте конвертер успешно использует внедренную службу для извлечения объекта из базы данных).

Очевидно, что метод bean-компонента save никогда не вызывается, так как представление застревает в фазе проверки jsf с этой ошибкой.

Пробовал заменить rich:select на h:selectOneMenu, но то же самое. Я просмотрел множество руководств/документов/ссылок по jsf-конвертеру, но я до сих пор не знаю, что я могу делать неправильно.

Я использую maven и конфигурацию спецификации Richfaces, как указано здесь, заменил версию на 4.2. 2. Окончательно (надеюсь, что обновление может это исправить)

Я разместил здесь тестовый проект.

Любая помощь будет очень признательна, я потратил так много времени, пытаясь найти решение для этого, может быть, это что-то простое/глупое, но я просто устал от отладки/поиска


person higuaro    schedule 19.10.2012    source источник


Ответы (1)


Вам нужно реализовать equals() и hashCode() внутри класса Test, чтобы JSF мог найти выбранный и преобразованный элемент в списке элементов. После преобразования JSF сравнит выбранный элемент с элементами в списке и выдаст эту ошибку, если не найдет его.

person stefanglase    schedule 19.10.2012