Причинение преобразования типа поля GORM для проверки правильности - PullRequest
0 голосов
/ 08 декабря 2011

У меня есть класс домена grails со свойством Integer, например:

class MyDomainClass {

    Integer i

    static   constraints = {
        i(min: 0, max 5, 
            validator: {
                // Something that fails when type conversion was used.
            }
    }
}

Если для i задано нецелое число, например, 3.1, для i будет установлено значение 3 из-за преобразования типов.Но я хочу либо отключить преобразование типов для i, либо, предпочтительно, выполнить проверку без проверки, если она была первоначально задана с помощью преобразования типов.

Примечание.конструктор свойств по умолчанию.

Можно ли это сделать?

Ответы [ 2 ]

3 голосов
/ 08 декабря 2011

В вашем валидаторе Cusom вы сможете получить доступ к исходному значению i из параметров запроса. Для этого вам сначала нужно получить текущий HttpServletRequest. Есть вспомогательный класс Spring / Grails, который позволяет вам получать текущий запрос из любого места, хотя это не особенно рекомендуемая практика

Затем вы можете сами проверить, является ли это значение целым числом, например,

static   constraints = {
    i(min: 0, max 5, 
        validator: {
            try {
                def originalValue = getRequestParam('i')
                return true
            } catch (NumberFormatException ex) {
                return false
            }
        }
    )
}
0 голосов
/ 08 декабря 2011

К моменту выполнения валидатора значение уже приведено.

Я думаю, что самый простой способ - создать пользовательский сеттер. В пользовательском установщике вы можете взять значение, сделать с ним то, что вы хотите, и, если оно не является целым числом, выдать ошибку. Вы даже можете имитировать исключение проверки, если хотите.

Этот подход должен охватывать все ваши варианты использования, если только вы явно не обращаетесь к полю класса с помощью оператора. @.

EDIT: вам нужно убедиться, что в вашем контроллере вы не делаете:

params.getInteger('paramName')

потому что там может произойти приведение, и даже ваш пользовательский сеттер не поможет.

...