Проверка Grails не работает

Я пытаюсь выполнить некоторую проверку объекта класса домена, но получаю странное исключение, когда вызываю метод «проверить». У меня есть форма, в которую я ввожу некоторые данные: Html formВот код моей формы:

<body>
<div id='register'>
    <div class='inner'>
        <div class='fheader'>Register</div>

        <g:if test='${flash.message}'>
            <div class='login_message'>${flash.message}</div>
        </g:if>

        <form action='<g:createLink controller="register" action="create" />' method='POST' id='registerForm' class='cssform' autocomplete='off'>
            <p>
                <label for='username'>Username:</label>
                <input type='text' class='text_' name='username' id='username'/>
            </p>

            <p>
                <label for='password'>Password:</label>
                <input type='password' class='text_' name='password' id='password'/>
            </p>

            <p>
                <label for='passwordConfirmation'>Confirm:</label>
                <input type='password' class='text_' name='passwordConfirm' id='passwordConfirmation'/>
            </p>

            <p>
                <input type='submit' id="submit" value='REGISTER'/>
            </p>
        </form>
    </div>
</div>
</body>

Вот код моего контроллера. Метод, который получает POST, называется «создать».

package genealogicaltree

import gentree.security.UserCommand
import grails.converters.JSON
import org.springframework.security.access.annotation.Secured

@Secured('permitAll')
class RegisterController {

    static allowedMethods = [index:'GET', create:['POST']]

    def springSecurityService

    def index() {
       render(view: 'register')
    }

    def create() {
        def userCommand = new UserCommand(params)
        if(userCommand.validate())
            render "valid"
        else
            render "invalid"
    }
}

Вот как выглядит мой доменный класс:

class UserCommand{
    public String username 
    public String password
    public String passwordConfirm
    static constraints = {
        username  size: 6..15, blank: false
        password  size: 6..15, blank: false
        passwordConfirm blank: false
    }
}

Используя отладку, я вижу, что данные из POST привязаны к объекту userCommand: введите описание изображения здесь

Однако я получаю такое сообщение об ошибке: введите здесь описание изображения

Вот вывод консоли:

Error |
2015-04-02 15:41:57,180 [http-bio-8080-exec-7] ERROR errors.GrailsExceptionResolver  - NotReadablePropertyException occurred when processing request: [POST] /GenealogicalTree/register/create - parameters:
passwordConfirm: password
username: username
password: ***
Invalid property 'username' of bean class [gentree.security.UserCommand]: Bean property 'username' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?. Stacktrace follows:
Message: Invalid property 'username' of bean class [gentree.security.UserCommand]: Bean property 'username' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?
    Line | Method
->>   20 | create    in genealogicaltree.RegisterController
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|    198 | doFilter  in grails.plugin.cache.web.filter.PageFragmentCachingFilter
|     63 | doFilter  in grails.plugin.cache.web.filter.AbstractFilter
|     53 | doFilter  in grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter
|     49 | doFilter  in grails.plugin.springsecurity.web.authentication.RequestHolderAuthenticationFilter
|     82 | doFilter  in grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter
|   1145 | runWorker in java.util.concurrent.ThreadPoolExecutor
|    615 | run       in java.util.concurrent.ThreadPoolExecutor$Worker
^    745 | run . . . in java.lang.Thread

Исключение возникает, когда код вызывает «userCommand.validate()». Я не понимаю, что я делаю неправильно здесь. Заранее спасибо!


person Zan    schedule 02.04.2015    source источник
comment
Вы пробовали добавлять геттеры и сеттеры?   -  person christopher    schedule 02.04.2015
comment
Оно работает. Разве Grails не должен генерировать эти методы по умолчанию? Если я правильно помню, я мог бы вызывать сеттеры и геттеры для объектов доменных классов без необходимости писать методы. Я все еще изучаю Grails и время от времени делаю глупые ошибки. Опубликуйте свой ответ, чтобы я мог отметить его как правильный.   -  person Zan    schedule 03.04.2015
comment
Какую версию Grails вы используете?   -  person christopher    schedule 03.04.2015


Ответы (1)


Вы должны добавить геттеры и сеттеры в свой класс домена, чтобы удалить это.

Компилятор Grails будет генерировать эти методы по умолчанию, например.

myObject.myValue = "hello"; 

такой же как

myObject.setMyValue("hello");

Однако это явно не идеально, и вы получаете такие ошибки! Если вы используете Grails версии ‹ 2.3.2, то это известная ошибка, и существует Jira Проблема для него, поэтому вы можете решить ее, обновив свою версию Grails.

person christopher    schedule 02.04.2015
comment
Дело в том, что я использую Grails 2.4.4. Это немного странно, но это сработало, так что я счастлив. - person Zan; 03.04.2015
comment
Ну.. да это странно. Возможно, вы должны прокомментировать этот вопрос! - person christopher; 03.04.2015