Grails: как переопределить сгенерированный метод обслуживания? - PullRequest
0 голосов
/ 30 июня 2019

Граальс новичок здесь.Я хотел бы переопределить методы 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
    }
}

1 Ответ

1 голос
/ 01 июля 2019

Возможно, вы не хотите переопределять метод 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 для других целей, удалите его.

EDIT

Обращаясь к комментарию ниже:

Где я могу разместить код для findByOwner (), показанный выше?Его нельзя добавить в абстрактный интерфейс.

Я не согласен с этим.Это определенно может быть в абстрактном интерфейсе.Вы можете превратить PlayerFileService в abstract class и сделать findByOwner конкретным методом, но это не обязательно.Это может быть абстрактный метод в интерфейсе, что является обычным явлением в Службе данных 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"']

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...