Grails 验证不起作用
Grails validation not working
我正在尝试对域 class 对象进行一些验证,但在调用 'validate' 方法时出现奇怪的异常。我有一个表格,我可以在其中输入一些数据:
这是我的表单代码:
<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 的方法是 'create'.
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 的样子:
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()'时抛出异常。我不明白我在这里做错了什么。提前致谢!
您应该将 getter 和 setter 添加到您的域中 class 以删除它。
Grails 编译器会默认生成这些方法,例如。
myObject.myValue = "hello";
与
相同
myObject.setMyValue("hello");
然而,它显然并不完美,你会得到这样的错误!如果您使用的 Grails 版本 < 2.3.2,那么这是一个已知错误并且有一个 Jira Issue,因此您可以通过升级您的 Grails 版本来解决它。
我正在尝试对域 class 对象进行一些验证,但在调用 'validate' 方法时出现奇怪的异常。我有一个表格,我可以在其中输入一些数据:
<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 的方法是 'create'.
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 的样子:
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()'时抛出异常。我不明白我在这里做错了什么。提前致谢!
您应该将 getter 和 setter 添加到您的域中 class 以删除它。
Grails 编译器会默认生成这些方法,例如。
myObject.myValue = "hello";
与
相同myObject.setMyValue("hello");
然而,它显然并不完美,你会得到这样的错误!如果您使用的 Grails 版本 < 2.3.2,那么这是一个已知错误并且有一个 Jira Issue,因此您可以通过升级您的 Grails 版本来解决它。