использование AutoCompleteTextField в калитке без String в качестве универсального типа - PullRequest
5 голосов
/ 08 марта 2011

Этот вопрос следует за этим: обработка события onchange AutoCompleteTextField в калитке

Я пытаюсь использовать AutoCompleteTextField с пользовательским классом в качестве универсального типа и добавить AjaxFormComponentUpdatingBehavior AjaxFormComponentUpdatingBehavior,Я имею в виду, что хочу иметь

AutoCompleteTextField<SomeClass> myAutoComplete = ...;

и после этого добавить AjaxFormComponentUpdatingBehavior:

myAutoComplete.add(new AjaxFormComponentUpdatingBehavior("onchange") {

        @Override
        protected void onUpdate(AjaxRequestTarget target) {
            System.out.println( "Value: "+getValue() );

        }
    });

Проблема заключается в том, что по какой-то причине при добавлении этого поведения форма пытаетсяустановить объект модели со строкой (даже если AutoCompleteTextField имеет универсальный тип SomeClass), вызывая исключение ClassCastException при возникновении события onchange.

Есть ли способ использовать AutoCompleteTextField, если он не равен AutoCompleteTextField<String>?Я не мог найти ни одного примера.Спасибо за ваше время!

и спасибо пользователю biziclop за помощь в этом вопросе.

1 Ответ

5 голосов
/ 08 марта 2011

Это не связано с обработчиком событий, оно вызвано отсутствием типа модели, установленного в вашем компоненте.

Компоненты формы могут получать тип модели из 3 источников:

  1. Разрешите его автоматически, если вы используете PropertyModel или CompoundPropertyModel.
  2. Примите его в качестве дополнительного параметра конструктора.
  3. С помощью метода setType().
  4. (Если ничего из вышеперечисленного не применимо, по умолчанию используется строковое или логическое значение для флажков.)

Это ваши варианты, вы можете выбрать любой из трех, но я думаю,1 лучше, чем 2, что лучше, чем 3.

Обновление: Вы, вероятно, уже знаете это, но если ваш пользовательский класс действительно пользовательский, вам также понадобится IConverter, которыйобрабатывает преобразования String <-> Someclass: вы можете либо зарегистрировать его в приложении, либо переопределить метод getConverter(Class<?> clazz ) вашего компонента, чтобы вернуть его.

...