Grails:如何覆盖生成的服务方法?
Grails: How to override generated service method?
这里是Grails新手。我想覆盖此处显示的生成服务的 get() 和 list() 方法。
@Service(PlayerFile)
interface PlayerFileService {
PlayerFile get(Serializable id)
List<PlayerFile> list(Map args)
Long count()
void delete(Serializable id)
PlayerFile save(PlayerFile playerFile)
}
为什么?默认 service/scaffolding 模型显示 PlayerFile class 的所有域对象。我想对此进行过滤,以便仅显示属于已登录用户(即所有者)的对象。
感谢您就如何执行此操作提出的建议。
这是 PlayerFile 域 class
class PlayerFile {
String playersJson
Date dateCreated
Date lastUpdated
static belongsTo = [owner: User]
static constraints = {
playersJson sqlType: 'text', nullable: false, widget: 'textarea'
owner nullable: false, editable: false
}
}
您可能不想覆盖 get
方法。您可能想要一种新的查询方法...
@Service(PlayerFile)
interface PlayerFileService {
PlayerFile get(Serializable id)
List<PlayerFile> list(Map args)
Long count()
void delete(Serializable id)
PlayerFile save(PlayerFile playerFile)
List<PlayerFile> findByOwner(User owner)
}
如果您不需要 get
方法用于其他目的,请将其删除。
编辑
解决下面的评论:
Where do I put the code for findByOwner() shown above? It can't be
added to an abstract interface.
我不同意。它绝对可以在抽象接口中。您可以将 PlayerFileService
变成 abstract
class
并使 findByOwner
成为具体方法,但您不必这样做。它可以是接口中的抽象方法,这在像这样的 GORM 数据服务中很常见。
在 https://github.com/jeffbrown/rock298query 查看项目。
package rock298query
import grails.gorm.services.Service
@Service(PlayerFile)
interface PlayerFileService {
PlayerFile get(Serializable id)
List<PlayerFile> list(Map args)
Long count()
void delete(Serializable id)
PlayerFile save(PlayerFile playerFile)
List<PlayerFile> findByOwner(User owner)
}
package rock298query
class BootStrap {
UserService userService
PlayerFileService playerFileService
def init = { servletContext ->
def jeff = userService.save('Jeff')
def jake = userService.save('Jake')
jeff.addToFiles(new PlayerFile(playersJson: '{"title":"Jeff File 1"'))
jeff.addToFiles(new PlayerFile(playersJson: '{"title":"Jeff File 2"'))
jeff.addToFiles(new PlayerFile(playersJson: '{"title":"Jeff File 3"'))
userService.save jeff
jake.addToFiles(new PlayerFile(playersJson: '{"title":"Jake File 1"'))
jake.addToFiles(new PlayerFile(playersJson: '{"title":"Jake File 2"'))
jake.addToFiles(new PlayerFile(playersJson: '{"title":"Jake File 3"'))
userService.save jake
}
def destroy = {
}
}
package rock298query
class DemoController {
PlayerFileService playerFileService
UserService userService
def jakeFiles() {
def jake = userService.find('Jake')
def files = playerFileService.findByOwner(jake)
render files*.playersJson
}
def jeffFiles() {
def jeff = userService.find('Jeff')
def files = playerFileService.findByOwner(jeff)
render files*.playersJson
}
}
这一切似乎都有效。
~ $ curl http://localhost:8080/demo/jakeFiles
['{"title":"Jake File 1"', '{"title":"Jake File 2"', '{"title":"Jake File 3"']
~ $
~ $ curl http://localhost:8080/demo/jeffFiles
['{"title":"Jeff File 1"', '{"title":"Jeff File 2"', '{"title":"Jeff File 3"']
希望对您有所帮助。
这里是Grails新手。我想覆盖此处显示的生成服务的 get() 和 list() 方法。
@Service(PlayerFile)
interface PlayerFileService {
PlayerFile get(Serializable id)
List<PlayerFile> list(Map args)
Long count()
void delete(Serializable id)
PlayerFile save(PlayerFile playerFile)
}
为什么?默认 service/scaffolding 模型显示 PlayerFile class 的所有域对象。我想对此进行过滤,以便仅显示属于已登录用户(即所有者)的对象。
感谢您就如何执行此操作提出的建议。
这是 PlayerFile 域 class
class PlayerFile {
String playersJson
Date dateCreated
Date lastUpdated
static belongsTo = [owner: User]
static constraints = {
playersJson sqlType: 'text', nullable: false, widget: 'textarea'
owner nullable: false, editable: false
}
}
您可能不想覆盖 get
方法。您可能想要一种新的查询方法...
@Service(PlayerFile)
interface PlayerFileService {
PlayerFile get(Serializable id)
List<PlayerFile> list(Map args)
Long count()
void delete(Serializable id)
PlayerFile save(PlayerFile playerFile)
List<PlayerFile> findByOwner(User owner)
}
如果您不需要 get
方法用于其他目的,请将其删除。
编辑
解决下面的评论:
Where do I put the code for findByOwner() shown above? It can't be added to an abstract interface.
我不同意。它绝对可以在抽象接口中。您可以将 PlayerFileService
变成 abstract
class
并使 findByOwner
成为具体方法,但您不必这样做。它可以是接口中的抽象方法,这在像这样的 GORM 数据服务中很常见。
在 https://github.com/jeffbrown/rock298query 查看项目。
package rock298query
import grails.gorm.services.Service
@Service(PlayerFile)
interface PlayerFileService {
PlayerFile get(Serializable id)
List<PlayerFile> list(Map args)
Long count()
void delete(Serializable id)
PlayerFile save(PlayerFile playerFile)
List<PlayerFile> findByOwner(User owner)
}
package rock298query
class BootStrap {
UserService userService
PlayerFileService playerFileService
def init = { servletContext ->
def jeff = userService.save('Jeff')
def jake = userService.save('Jake')
jeff.addToFiles(new PlayerFile(playersJson: '{"title":"Jeff File 1"'))
jeff.addToFiles(new PlayerFile(playersJson: '{"title":"Jeff File 2"'))
jeff.addToFiles(new PlayerFile(playersJson: '{"title":"Jeff File 3"'))
userService.save jeff
jake.addToFiles(new PlayerFile(playersJson: '{"title":"Jake File 1"'))
jake.addToFiles(new PlayerFile(playersJson: '{"title":"Jake File 2"'))
jake.addToFiles(new PlayerFile(playersJson: '{"title":"Jake File 3"'))
userService.save jake
}
def destroy = {
}
}
package rock298query
class DemoController {
PlayerFileService playerFileService
UserService userService
def jakeFiles() {
def jake = userService.find('Jake')
def files = playerFileService.findByOwner(jake)
render files*.playersJson
}
def jeffFiles() {
def jeff = userService.find('Jeff')
def files = playerFileService.findByOwner(jeff)
render files*.playersJson
}
}
这一切似乎都有效。
~ $ curl http://localhost:8080/demo/jakeFiles
['{"title":"Jake File 1"', '{"title":"Jake File 2"', '{"title":"Jake File 3"']
~ $
~ $ curl http://localhost:8080/demo/jeffFiles
['{"title":"Jeff File 1"', '{"title":"Jeff File 2"', '{"title":"Jeff File 3"']
希望对您有所帮助。