Grails:如何覆盖生成的服务方法?

标签 grails

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)
}

为什么?默认服务/脚手架模型显示 PlayerFile 类的所有域对象。我想对此进行过滤,以便仅显示属于登录用户(即所有者)的对象。

感谢您对如何执行此操作的建议。

这是 PlayerFile 域类
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.



我不同意这一点。它绝对可以在一个抽象接口(interface)中。你可以转PlayerFileService进入 abstract class并制作 findByOwner一个具体的方法,但你不必这样做。它可以是接口(interface)中的抽象方法,这在像这样的 GORM 数据服务中是很常见的。

请参阅 https://github.com/jeffbrown/rock298query 上的项目.

https://github.com/jeffbrown/rock298query/blob/3eb713a5ac2692be1fd9666eb7e6b26c8c9a0921/grails-app/services/rock298query/PlayerFileService.groovy
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)
}

https://github.com/jeffbrown/rock298query/blob/3eb713a5ac2692be1fd9666eb7e6b26c8c9a0921/grails-app/init/rock298query/BootStrap.groovy
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 = {
    }
}

https://github.com/jeffbrown/rock298query/blob/3eb713a5ac2692be1fd9666eb7e6b26c8c9a0921/grails-app/controllers/rock298query/DemoController.groovy
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:如何覆盖生成的服务方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56825387/

相关文章:

java - 无法初始化代理 - hibernate - grails - Multi-Tenancy

grails - 与namedQuery以多对多关系获取随机记录

grails - 如何使用Spring Security SAML插件在项目中指定updatePasswordUrl(例如loginFormUrl = '/saml/login')

grails - 为什么Grails使用Ivy作为构建和依赖管理器?

Grails - 通过考虑时区的用户显示日期

oracle - Grails 2.0数据库连接超时,SockectException

grails - 如何在 IntelliJ 中创建适当的 grails 域类并链接到 View 及其各自的 Controller ?

grails - 我在createCriteria中遇到投影问题

java - 我如何在 Grails 中生成数据库表?

sql - Grails HQL 与 SQL 语句