Grails,用于更新的自定义可验证对象
Grails, Custom Validatable object for updating
我对我的用户进行了自定义验证。它工作正常但用于创建但是当我想更新用户时我遇到错误。有些字段在更新部分不可用,例如用户名、密码和电子邮件,这些字段不应为空。
import grails.validation.Validateable
class UserCommand implements Validateable {
Long id
String firstName
String lastName
String username
String password
String email
UserStatus status = UserStatus.CREATED
static constraints = {
firstName nullable: false, blank: false
lastName nullable: false, blank: false
username nullable: false, blank: false, validator: { val, obj ->
if (obj.id) {
if (User.countByUsernameAndIdNotEqual(val,obj.id)) {
return "user.already.exist"
}
} else {
if (User.countByUsername(val)) {
return "user.already.exist"
}
}
}
password nullable: false, blank: false
email nullable: false, blank: false, validator: { val, obj ->
if (obj.id) {
if (User.countByEmailAndIdNotEqual(val,obj.id)) {
return "user.already.exist"
}
} else {
if (User.countByEmail(val)) {
return "user.already.exist"
}
}
}
}
}
在我的控制器中,当我想验证输入时,它给了我一个 NullPointerException
因为提到的字段不应该为空。
def update(UserCommand command) {
if(command.validate()) {
try {
user = userService.update(command)
} catch (ValidationException e) {
respond user.errors, view: 'edit'
return
}
}
}
这是 edit.gsp
:
<!DOCTYPE html>
<html>
<head>
<title>Edit information</title>
<meta name="layout" content="main"/>
<asset:stylesheet src="bootstrap.css" rel="stylesheet"/>
</head>
<body>
<g:form resource="${this.user}" controller="user" action="update" method="put">
<div class="container">
<div class="row">
<div class="col-md-6">
<div class="inputWithIcon">
<input type="text" class="custom-input" name="firstName" placeholder="First Name" value="${this.user.firstName}">
<i class="fa fa-id-badge fa-lg fa-fw" aria-hidden="true"></i>
</div>
</div>
<div class="col-md-6">
<div class="inputWithIcon">
<input type="text" class="custom-input" name="lastName" placeholder="Last Name" value="${this.user.lastName}">
<i class="fa fa-id-card fa-lg fa-fw" aria-hidden="true"></i>
</div>
</div>
</div>
<div class="row">
<div class="col-md-4">
<div class="inputWithIcon">
<input type="text" class="custom-input" name="country" placeholder="Country" value="${this.user.country}">
<i class="fa fa-globe fa-lg fa-fw" aria-hidden="true"></i>
</div>
</div>
<div class="col-md-8">
<div class="inputWithIcon">
<textarea type="text" class="custom-input" name="address" placeholder="Address" rows="3">${this.user.address}</textarea>
<i class="fa fa-address-card fa-lg fa-fw" aria-hidden="true"></i>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<button type="submit" class="custom-button edit">Update</button>
</div>
</div>
</div>
</g:form>
</div>
</body>
</html>
处理验证的最佳方法是什么(也许我没有完全理解这个概念)?以及如何解决这个问题?
提前致谢!
我想你可能想要做的是在 update
方法中加载 UserCommand
,根据传入的参数更新字段。
所以不是你的更新方法,像
def update() {
UserCommand command = UserCommand.get(params.id)
command.firstName = params.firstName // and more based on whatever you can update
if(command.validate()) {
try {
user = userService.update(command)
} catch (ValidationException e) {
respond user.errors, view: 'edit'
return
}
}
}
您也可以在 <input type='hidden'/>
中的 edit.gsp 上拥有所有不可更新的字段,但我的偏好是不要发送这样的数据,因为恶意的人仍然可以更新那些使用 DOM inspector 或类似工具可以很容易地填写字段。
您可能也遇到了困难。
这些可以内置到您的用户 GORM 中 Class 从而使您不必构建单独的 CommandObject。
虽然我很确定你知道这一点。我只是把它放在这里,供可能正在搜索该主题的其他人使用。
我对我的用户进行了自定义验证。它工作正常但用于创建但是当我想更新用户时我遇到错误。有些字段在更新部分不可用,例如用户名、密码和电子邮件,这些字段不应为空。
import grails.validation.Validateable
class UserCommand implements Validateable {
Long id
String firstName
String lastName
String username
String password
String email
UserStatus status = UserStatus.CREATED
static constraints = {
firstName nullable: false, blank: false
lastName nullable: false, blank: false
username nullable: false, blank: false, validator: { val, obj ->
if (obj.id) {
if (User.countByUsernameAndIdNotEqual(val,obj.id)) {
return "user.already.exist"
}
} else {
if (User.countByUsername(val)) {
return "user.already.exist"
}
}
}
password nullable: false, blank: false
email nullable: false, blank: false, validator: { val, obj ->
if (obj.id) {
if (User.countByEmailAndIdNotEqual(val,obj.id)) {
return "user.already.exist"
}
} else {
if (User.countByEmail(val)) {
return "user.already.exist"
}
}
}
}
}
在我的控制器中,当我想验证输入时,它给了我一个 NullPointerException
因为提到的字段不应该为空。
def update(UserCommand command) {
if(command.validate()) {
try {
user = userService.update(command)
} catch (ValidationException e) {
respond user.errors, view: 'edit'
return
}
}
}
这是 edit.gsp
:
<!DOCTYPE html>
<html>
<head>
<title>Edit information</title>
<meta name="layout" content="main"/>
<asset:stylesheet src="bootstrap.css" rel="stylesheet"/>
</head>
<body>
<g:form resource="${this.user}" controller="user" action="update" method="put">
<div class="container">
<div class="row">
<div class="col-md-6">
<div class="inputWithIcon">
<input type="text" class="custom-input" name="firstName" placeholder="First Name" value="${this.user.firstName}">
<i class="fa fa-id-badge fa-lg fa-fw" aria-hidden="true"></i>
</div>
</div>
<div class="col-md-6">
<div class="inputWithIcon">
<input type="text" class="custom-input" name="lastName" placeholder="Last Name" value="${this.user.lastName}">
<i class="fa fa-id-card fa-lg fa-fw" aria-hidden="true"></i>
</div>
</div>
</div>
<div class="row">
<div class="col-md-4">
<div class="inputWithIcon">
<input type="text" class="custom-input" name="country" placeholder="Country" value="${this.user.country}">
<i class="fa fa-globe fa-lg fa-fw" aria-hidden="true"></i>
</div>
</div>
<div class="col-md-8">
<div class="inputWithIcon">
<textarea type="text" class="custom-input" name="address" placeholder="Address" rows="3">${this.user.address}</textarea>
<i class="fa fa-address-card fa-lg fa-fw" aria-hidden="true"></i>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<button type="submit" class="custom-button edit">Update</button>
</div>
</div>
</div>
</g:form>
</div>
</body>
</html>
处理验证的最佳方法是什么(也许我没有完全理解这个概念)?以及如何解决这个问题?
提前致谢!
我想你可能想要做的是在 update
方法中加载 UserCommand
,根据传入的参数更新字段。
所以不是你的更新方法,像
def update() {
UserCommand command = UserCommand.get(params.id)
command.firstName = params.firstName // and more based on whatever you can update
if(command.validate()) {
try {
user = userService.update(command)
} catch (ValidationException e) {
respond user.errors, view: 'edit'
return
}
}
}
您也可以在 <input type='hidden'/>
中的 edit.gsp 上拥有所有不可更新的字段,但我的偏好是不要发送这样的数据,因为恶意的人仍然可以更新那些使用 DOM inspector 或类似工具可以很容易地填写字段。
您可能也遇到了困难。
这些可以内置到您的用户 GORM 中 Class 从而使您不必构建单独的 CommandObject。
虽然我很确定你知道这一点。我只是把它放在这里,供可能正在搜索该主题的其他人使用。