在 grails 3 中,使用命令对象,你怎么不更新说密码字段?
in grails 3, with command objects, how do you NOT update say password field?
如果您有一个服务方法 save(User user),它只调用 user.save(),如果用户说过编辑他的地址?密码不会发送到更新视图。在过去,我们曾经有过这样的事情:
def update(Map params) {
params.remove("password")
player.properties = params
player.save()
}
现在我们有了这个:
interface IUserService {
User get(Serializable id)
List<User> list(Map args)
Long count()
void delete(Serializable id)
User save(User user)
User update(User user)
}
@Service(User)
@Transactional
abstract class UserService implements IUserService {
@Override
User update(User user) {
user.save() // this will overwrite the password, or fail if the password is null.
}
params.remove 的新等价物是什么?我们如何在更新对象时不更新密码?我想我们可以从数据库中读取当前密码,并在保存之前将其分配给传入的对象,但这是另一次读取。或者我们可以编写一些自定义 sql 来更新每个字段而不是我们想要屏蔽的字段?
您可以使用 bindable
约束将属性配置为不参与批量 属性 绑定。
class User {
String username
String password
static constraints = {
password bindable: false
}
}
现在数据绑定器将在数据绑定过程中排除 password
属性,您可以决定 when/if 属性 已更新。每当您想更新密码时,您都可以执行类似 per.password = params.password
(或类似)的操作。
如果您有一个服务方法 save(User user),它只调用 user.save(),如果用户说过编辑他的地址?密码不会发送到更新视图。在过去,我们曾经有过这样的事情:
def update(Map params) {
params.remove("password")
player.properties = params
player.save()
}
现在我们有了这个:
interface IUserService {
User get(Serializable id)
List<User> list(Map args)
Long count()
void delete(Serializable id)
User save(User user)
User update(User user)
}
@Service(User)
@Transactional
abstract class UserService implements IUserService {
@Override
User update(User user) {
user.save() // this will overwrite the password, or fail if the password is null.
}
params.remove 的新等价物是什么?我们如何在更新对象时不更新密码?我想我们可以从数据库中读取当前密码,并在保存之前将其分配给传入的对象,但这是另一次读取。或者我们可以编写一些自定义 sql 来更新每个字段而不是我们想要屏蔽的字段?
您可以使用 bindable
约束将属性配置为不参与批量 属性 绑定。
class User {
String username
String password
static constraints = {
password bindable: false
}
}
现在数据绑定器将在数据绑定过程中排除 password
属性,您可以决定 when/if 属性 已更新。每当您想更新密码时,您都可以执行类似 per.password = params.password
(或类似)的操作。