0

我正在研究 Grails 示例应用程序。我有一个控制器和一个命令对象,用于验证请求参数,如下所示。

package com.samples

class UserController {

    def index() { redirect action:getUser }

    def getUser(UserCommand userCommand) {
        if(userCommand.hasErrors()){
            if(userCommand.errors.hasFieldErrors("login")) {
                render "provide valid login"
            } else if(userCommand.errors.hasFieldErrors("password")) {
                 render "provide valid password"
            }

        } else {
            render "The user login and password is valid"
        }
    }
}

class UserCommand {
    String login
    String password 

    static constraints = {
        login(blank: false)
        password(blank: false)
    }

}

当我运行 Grails 应用程序并浏览时,我收到以下错误:

URI
    /Library/user/getUser
Class
    java.lang.NoSuchMethodError
Message
    com.samples.UserCommand.getLogin()Ljava/lang/Object;

该错误表明它正在寻找getLogin()方法,但我认为 get/set 方法将由 Grails 动态生成。

4

4 回答 4

0

除了

def index() { redirect action: getUser }

需要改为

def index() { redirect action: "getUser" }

看来您的代码工作正常。

对于一般的命令对象:

如果您在控制器中包含命令对象,则它已经是“可验证的”。另外,不要把它放在域类中,除非你想持久化数据。如果要将命令对象保留在控制器之外,请将其放在 src/groovy 中,在这种情况下,您需要将其标记为@grails.validation.Validateable.

至于您的代码,请将错误消息放在命令对象中,而不是控制器操作中,因此您可以在一个地方检查它们,然后将带有错误的命令对象返回到视图以显示错误。

package com.samples

class UserController {

    def index() { redirect action: "getUser" }

    def getUser(UserCommand userCommand) {
        if(userCommand.hasErrors()){
            return [userCommand: userCommand]  //if you are returning to the getUser view
        } else {
            render "The user login and password are correct"
        }
    }
}

class UserCommand {
    String login
    String password 

    static constraints = {
        login(blank: false)
        password(blank: false)
    }

}

有关更多信息,请参阅 Grails 文档:http: //grails.org/doc/latest/guide/single.html#commandObjects

于 2013-09-11T16:19:47.363 回答
0

尝试在 grails-app/domain 包中添加 UserCommand 类。我认为它在域包之外,并且 grails 无法生成 getter/setter。

于 2013-09-11T15:35:52.240 回答
0

当我在 UserController 类中包含 UserCommand 类(而不是在同一文件中作为单独的类编写)时,它工作正常。

感谢你的回复。

于 2013-09-16T05:34:55.223 回答
0

代码没有问题,应该可以正常工作。请检查是否

  • 源文件的扩展名是 groovy。
  • 您在正确的包和文件夹中拥有源文件。
  • 做一个圣杯清洁。

我猜你只是在尝试使用 Grails 框架,但要寻找更好的方法在 Grails 中做事。

于 2013-09-12T06:28:02.923 回答