Как переключить проект Spring Roo или Grails с типичного MVC на AJAX / JSON / REST - PullRequest
7 голосов
/ 18 января 2012

Это может показаться странным вопросом, но я пытаюсь понять, что такое «наилучшая практика» для преобразования приложения, настроенного на использование чего-то вроде контроллеров Roo или Grails (которые предоставляют базовыеФункциональность CRUD) к чему-то, что вместо этого возвращает тело ответа JSON для использования в приложении JavaScript.

Неоднозначность технологии заключается в том, что я еще не начал проект.Я все еще пытаюсь решить, какую (основанную на Java) технологию использовать, и посмотреть, какие инструменты производительности я должен изучить / использовать в процессе.Это будет веб-приложение, и оно будет использовать слой постоянства базы данных.Все остальные детали находятся в воздухе.

Возможно, самый простой способ достичь моей цели - это начать использовать какой-нибудь плагин AJAX, но большинство уроков и описаний там говорят, чтобы начать снормальная архитектура MVC.Кажется, что Roo затрудняет преобразование генерируемых контроллеров в JSON-дружественные типы возврата, и я не достаточно знаком с Groovy / Grails, чтобы знать, что нужно для этого.

Это в основном опыт обучениядля меня, и я открыт для любой критики или совета, но, будучи форумом вопросов и ответов, я понимаю, что мне нужно включить какой-то объективный вопрос.Чтобы удовлетворить эту потребность, я спрашиваю:

Каков наилучший способ настроить интерфейс AJAX / RESTful для моих сущностей в Roo и / или Grails?

1 Ответ

8 голосов
/ 18 января 2012

Недавно я сделал именно это с приложением Grails и обнаружил, что на удивление легко взять сгенерированные контроллеры и заставить их выводить JSON, XML или HTML из представления в зависимости от согласования содержимого.

Местав руководстве по Grails есть раздел (ы) по согласованию содержимого и, если вам нужно иметь дело с вводом JSON или XML, маршалинг.


Чтобы получить вывод JSON и XML, по умолчаниюlist() метод, изменил его на это (у меня есть Session объект, в данном случае ... один из моих классов домена):

def list() {
    params.max = Math.min(params.max ? params.int('max') : 10, 100)
    def response = [sessionInstanceList: Session.list(params), sessionInstanceTotal: Session.count()]
    withFormat {
        html response
        json {render response as JSON}
        xml {render response as XML}
    }
}

Везде, где вы возвращаете только объект по умолчанию,Вы захотите заменить возвращаемое значение на блок withFormat.

Вам также может понадобиться обновить файл Config.groovy, где он работает с типами mime.Вот что у меня есть:

grails.mime.file.extensions = true // enables the parsing of file extensions from URLs into the request format
grails.mime.use.accept.header = true
grails.mime.types = [ html: ['text/html','application/xhtml+xml'],
                      xml: ['text/xml', 'application/xml'],
                      text: 'text/plain',
                      js: 'text/javascript',
                      rss: 'application/rss+xml',
                      atom: 'application/atom+xml',
                      css: 'text/css',
                      csv: 'text/csv',
                      all: '*/*',
                      json: ['application/json','text/json'],
                      form: 'application/x-www-form-urlencoded',
                      multipartForm: 'multipart/form-data'
                    ]

В качестве входных данных (например, для действия update() или save()) полезные нагрузки JSON и XML будут автоматически распакованы и будут связаны как формавход будет, но я обнаружил, что процесс демаршалинга немного придирчив (особенно с JSON).

Я обнаружил, что для правильной обработки JSON в методе update(), class атрибут должен присутствовать и корректно входящий объект JSON.Поскольку библиотека, которую я использовал в своем клиентском приложении, не облегчала эту проблему, я переключился на использование XML.

...