Столкнулся с интересным поведением метода Spring контроллера, объявленного с аннотацией @InitBinder. Оказывается работа его зависит от порядка установки параметров!
Жил-поживал в @InitBinder-е контроллера Спринга кастомный эдитор StringTrimmerEditor.
Задача его очевидно угадывается по названию класса - отсекать пред- и пост-пробелы в строковых данных, приходящих в реквесте.
И вот столкнулись мы с проблемой, когда массив длиной более 256 элементов, приходящий в реквесте, перестал байндиться на объект модели типа List, кидая IndexOutOfBoundsException.. Проблема нечастая, но оказывается Гугль знает и про нее!
Очевидный же шаг, не так ли - добавить этот кастомный параметр в @InitBinder:
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
binder.setAutoGrowCollectionLimit(1000);
}
Но... Не работает!
Выношу установку параметра в отдельный метод, объявленный с аннотацией @InitBinder:
@InitBinder
public void initStringBinder(WebDataBinder binder) {
binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
}
@InitBinder
public void initListBinder(WebDataBinder binder) {
binder.setAutoGrowCollectionLimit(1000);
}
Спринг это допускает, но опять не работает..
И, наконец, в процессе проб всего и вся, удалений, замены типа binder-а в параметре метода, так как-то случайно получилось, что я переставил местами эти методы, и КОД ЗАРАБОТАЛ!!! О_о
То есть буквально вот так, в таком порядке следования методов в классе:
@InitBinder
public void initListBinder(WebDataBinder binder) {
binder.setAutoGrowCollectionLimit(1000);
}
@InitBinder
public void initStringBinder(WebDataBinder binder) {
binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
}
- работает, а наоборот (код выше) - не работает.
Попробовал и в одном методе.. Как в самом первом куске кода в этом сообщении - не работает, а строки кода в методе местами поменяешь - работает.
Что это?? Баг Спринга или я что-то не понимаю, не так делаю?