Мои index.gson, show.gson игнорируются с помощью grails 3.3.3 с использованием JsonViews 1.2.7
Борется с получением JSON API и рендерингом json для доменных классов. используя Grails v3.3.3 и JsonView 1.2.7
Хотя я понял, может быть, но ясно, что я не знаю.
Если я раскрываю класс домена с помощью аннотации @Resource, это автоматически генерирует контроллер и вывод json "по умолчанию".
однако мне нужен некоторый контроль над тем, что происходит, поэтому у меня есть другой класс домена (Customer и Site в моем демонстрационном приложении, где у Customer есть много сайтов).
Я не использую аннотацию @Resource ни в одном из этих классов домена.
Я вручную создаю два контроллера под названием CustomerRestController и SiteRestController вручную - и использую UrlMappings для предоставления URI. (один использует форму '(resources: controller)', а другой - с объявленным явным контроллером и действиями
class UrlMappings {
static mappings = {
"/api/customers"(resources:"customerRest")
//or try to declare with explicit mappings
"/api/sites" (controller: "siteRest", action: "index")
"/api/sites/$id" (controller: "siteRest", action: "show", view: "show")
"/$controller/$action?/$id?(.$format)?"{
constraints {
// apply constraints here
}
}
"/"(view:"/index")
"500"(view:'/error')
"404"(view:'/notFound')
}
}
Итак, давайте сначала посмотрим, что происходит с SiteRestController (с простой отладкой println, чтобы показать, что он вызывается в консоли). Я использовал модель сервиса данных GORM и только что определил интерфейс в сервисах и позволил Grails автоматически создать serviceImpl, а затем внедрить его в контроллер. Я объявил формат ответа [json]
@CompileStatic
class SiteRestController extends RestfulController {
static responseFormats = ['json']
SiteService siteService
SiteRestController() {
super (Site)
println "siteRest default constructor controller created"
}
def index (Integer max)/*(@PathVariable String manufacturerName)*/ {
println ("site.index: invoked index action on customer restful controller ")
respond siteService.list([:]), model:[siteCount: siteService.count()]
}
def show(Long id) {
println "site.show: show on SiteRestController called with $id"
respond siteService.get(id)
}
}
Я вручную создал /views/site/_site.gson, index.gson и show.gson
//_site.gson
import model.Site
println "_site template called " //added to check that template is being called
model {
Site site
}
json jsonapi.render (site)
чтобы показать, что представление игнорируется, я отредактировал show.gson следующим образом
import model.Site
model {
Site site
}
json g.render ([name:"will"])
и представление index.gson как
import model.Site
model {
List<Site> siteList
Long siteCount
}
println "index.gson more data"
json {
name "hello william"
}
поэтому, когда я запускаю приложение и вызываю URL /api/sites, я получаю это. Который является просто стандартным рендерингом и не использует _site.gson - и игнорирует мой index.gson
[
{
"id": 1,
"name": "headoffice",
"customer": {
"id": 1
}
}
]
и если я вызываю '/api/sites/1', я получаю следующее (это явно вызвало шаблон _sites.gson, но мой 'show.gson' был изменен, чтобы не использовать шаблон, и это явно игнорируется)
_site template called
{
"data": {
"type": "site",
"id": "1",
"attributes": {
"name": "headoffice"
},
"relationships": {
"customer": {
"links": {
"self": "/customer/show/1"
},
"data": {
"type": "customer",
"id": "1"
}
}
}
},
"links": {
"self": "/site/show/1"
}
}
Я также попытался сделать глубокий рендеринг из шаблона представления клиентов, как это
import model.Customer
model {
Customer customer
}
json jsonapi.render (customer, [deep:true, jsonApiObject:true])
который игнорирует детали моего сайта при глубокой визуализации при запросе / api / Customers/1. Обратите внимание, что сайт просто показывает идентификатор по умолчанию и, кажется, не вызывает _site.gson
{
"jsonapi": {
"version": "1.0"
},
"data": {
"type": "customer",
"id": "1",
"attributes": {
"name": "hsbc"
},
"relationships": {
"sites": {
"data": [
{
"type": "site",
"id": "1"
}
]
}
}
},
"links": {
"self": "/customer/show/1"
}
}
Так что я не понимаю, что здесь происходит. Grails имеет свои собственные внутренние сгенерированные значения по умолчанию и игнорирует предоставленные мною представления и т. Д., И, похоже, не выполняет глубокую визуализацию, когда этого требует.
Кто-нибудь может посоветовать, почему мои представления / шаблоны не вызываются так, как ожидалось?