Мои 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 имеет свои собственные внутренние сгенерированные значения по умолчанию и игнорирует предоставленные мною представления и т. Д., И, похоже, не выполняет глубокую визуализацию, когда этого требует.

Кто-нибудь может посоветовать, почему мои представления / шаблоны не вызываются так, как ожидалось?

0 ответов

Другие вопросы по тегам