grails v3.3.9:如何将scaffolded视图与rest API分开

问题描述 投票:1回答:1

grails v3.3.9

我将能够使用脚手架视图/控制器,但将它们与我的其余API视图和控制器分开。

我启动了我的项目应用程序来生成jsonApi所以我用这样的东西设置我的UrlMappings

   ...
   "/api/sites"(resources:'site') {
        "/devices" (resources:'device')
    } ...

然后我在grails-app / controllers中创建了RestfulController,默认约定假定您的控制器将是SiteController,然后使用您的gson模板编辑grails-app / views / site以进行休息渲染。到现在为止还挺好。

现在你来尝试搭建视图 - 平台默认开始破坏。

我在这样的UrlMappings中创建了一个新条目,将ui引导到自己的控制器

    "/ui/sites/$action?/$id?" (controller:"siteUI") {
        constraints {
            // apply constraints here
        }
    }

然后你可以像这样创建一个新的控制器

   class SiteUIController {
       static scaffold = x.y.z.Site
   }

并运行应用程序并在浏览器中以/ ui / sites访问 - 并呈现网站列表。

然而,两个直接问题

1)我的网站有一个组织域引用(单引用)(带有toString()),如果我查看生成的链接引用,它看起来像这样,(不知何故内部已经生成了对其余API控制器的引用和不是HTML控制器。)组织链接是

  http://localhost:8080/api/orgs/1

2)我的网站也有位置(网站有很多位置集合)(目前尚未在该域上定义toString)。当您查看生成的链接时,它看起来像这样。位置链接

http://localhost:8080/location/show/2 

这既不是休息/也不是HTML控制器!

我试图欺骗一点并保存我的休息端点,并做了一个生成控制器站点,并生成视图站点并搞砸了将这些放在正确的目录(views / siteUI,controller / siteUI等)并恢复我保存的休息端点再次回来。

这已经帮助了一小部分,因为我现在可以通过在浏览器中输入URL来输入正确的视图,例如“/ ui / sites / show / 1” - 并且它呈现正常。但它提供的链接不会工作,因为所有默认值都是错误的。

那我该怎么办?试图改变脚手架的所有'默认假设,观察逻辑等大规模的痛苦。我不想去那里。

我是先做所有的脚手架吗?得到那个工作,然后添加其余的控制器/视图?

我不想将UI与Rest控制器混合使用,以便它们可以单独独立工作,任何UI摆弄都不会弄乱/打破其余点,反之亦然

在我消失在一个正确的旧混乱之前 - 我想要一些关于保持这些事情的最佳方法的指导,而不破坏框架中的所有BAU平台标准/逻辑 - 这对我来说太难了。

有关接近这种情况的最佳方法的建议将得到很好的接受。我希望有人来到这里,并想出最好的方法。

rest grails scaffolding
1个回答
0
投票

我想我已经在Grails in Action中找到了答案 - 第二版第332页。

有时候会议超过惯例可能会令人困惑。基本上在UrlMappings中声明类似的东西时:

    "/api/sites"(resources:'site') {
        "/devices" (resources:'device')

您可能认为资源名称是指域类,实际上是控制器类的名称:

所以如果你这样命名映射

    "/api/sites"(resources:'siteRest') {
        "/devices" (resources:'deviceRest')

它会将请求推送到siteRest控制器。

此外,不是所有的控制器都位于grails-app / controllers中的一个级别,而是没有必要。

基本上如果你创建像两个子目录,比如/ rest和/ ui,并在每个子目录中放置相应的控制器(例如/rest/siteRestController.groovy和/ui/siteController.groovy),那么url解析机制正在寻找<stem>名称匹配在grails-app / controllers目录下。因此,主要要求是控制器名称是唯一的。

默认映射,然后选择并处理任何-generate-all / controller scaffolded控制器。

    "/$controller/$action?/$id?(.$format)?" {
        constraints {
            // apply constraints here
        }
    }

这使您可以远离HTML的探索,并且它可以阻止您与框架作斗争。

如果你想玩字段插件还有其他困难 - 但遗憾的是,必须保存另一个帖子。

观点我怀疑是以相同的方式匹配 - 我不确定 - 但是我现在已经将所有视图保留在grails-app / views中的同一级别(例如站点和siteRest文件夹并排在grails中 - 应用程序/视图)。

现在您可以使用say generate-all x.y.x.DomainClass,并将生成的文件移动到所需的控制器结构中。

PS我正在使用intellij,我在IDE缓存方面遇到了问题,抱怨在执行Application'run'时它可以/不能找到东西。基本上,如果您尝试Grails视图和'boot-run',并且它可以运行,但您的IDE正在抱怨,那么您就遇到了问题。

如果选择包区域(服务,域等)并右键单击并在中途找到'rebuild'选项 - 这似乎重置了该区域中的缓存,并且IDE中应用程序上的运行操作操作再次开始工作。这似乎对您的域模型中的更改以及generate-all生成的可能的grails数据服务特别敏感。执行重建操作似乎清除了缓存并让您重新开始工作。

如果你想看到一些这样的结构,你可以在GitHub上查看这个项目,它显示了迄今为止的工作

Sample

© www.soinside.com 2019 - 2024. All rights reserved.