К моменту выполнения валидатора значение уже приведено.
Я думаю, что самый простой способ - создать пользовательский сеттер.
В пользовательском установщике вы можете взять значение, сделать с ним то, что вы хотите, и, если оно не является целым числом, выдать ошибку. Вы даже можете имитировать исключение проверки, если хотите.
Этот подход должен охватывать все ваши варианты использования, если только вы явно не обращаетесь к полю класса с помощью оператора. @.
EDIT:
вам нужно убедиться, что в вашем контроллере вы не делаете:
params.getInteger('paramName')
потому что там может произойти приведение, и даже ваш пользовательский сеттер не поможет.