Grails - создать API только для чтения - PullRequest
0 голосов
/ 22 ноября 2011

Я хотел бы ограничить некоторые действия в контроллерах только для чтения. Есть ли способ, которым я мог бы сделать это? Я хочу, чтобы транзакция не сохранялась после выполнения определенных действий.

Любая помощь приветствуется.

Речь идет о 1.3.7.

Ответы [ 4 ]

4 голосов
/ 22 ноября 2011

«Как сделать домены только для чтения» - то, что время от времени появляется в списках рассылки и других местах.

Быстрый ответ: вы не можете на 100% защитить себя от записи.

Различные методы для достижения только чтения:

  1. Используйте метод .read () для получения объекта, который гарантирует, что вам нужно явно .save (), чтобы сохранить элемент.

  2. Если в sql вы можете создать представление и сопоставить класс этого домена с этим представлением, то сохранить его нельзя (и попытка сохранить приведет к ошибкам).

  3. Создайте исключение beforeUpdate (), тем самым остановив сохранение.

  4. Изменения в статическом отображении = {}, но я не совсем уверен, что там делать, это было упомянуто в списке рассылки, это все, что я могу вспомнить, поищите в Google nabble list для пользователя grails, если вы хочу узнать.

Если ваш материал довольно статичен, то представление MySQL - хороший выбор, если вам нужно запросить их, то beforeUpdate () может быть хорошим выбором.

Вы спрашиваете «только для чтения», вы имеете в виду леса? Программно запретить сохранение в действии контроллера не сложнее, чем просто ... не добавлять сохранение (или вообще не изменять объект).

2 голосов
/ 22 ноября 2011

Поместите логику в метод обслуживания Grails

class MyController {
  def myService

  def myAction = {
    myService.method(params)
    []
  }
  ...
}

и отметьте его как доступный только для чтения:

class MyService {
  @Transactional(readOnly = true)
  def method(def patams) { ... }
}
1 голос
/ 22 ноября 2011

Вы можете использовать метод withTransaction для объекта домена и настроить его на откат только там.

http://grails.org/doc/latest/ref/Domain%20Classes/withTransaction.html

Декларативное управление транзакциями встроено для сервисов, см. Справочное руководство Grails, Декларативные транзакции . Это не будет работать для контроллеров, но для этого есть плагин: http://www.grails.org/plugin/transactional-controller

0 голосов
/ 22 ноября 2011

Не уверен, достаточно ли это для вас, но есть метод чтения, который доступен только для чтения, в отличие от get http://grails.org/doc/latest/ref/Domain%20Classes/read.html

...