grails - 如何在 IntelliJ 中创建适当的 grails 域类并链接到视图及其各自的控制器?
问题描述
这是我第一次提出问题,所以反馈会很有帮助。我会尽量遵循这些指导方针。
我正在按照Grails Cookbook的教程来开发表单/数据库应用程序。教程让我先创建一个域类,然后是视图,然后是控制器。当我到达控制器部分时,我正在定义创建save()
新Person
对象的方法。IntelliJ 将其标记= new Person(params)
为错误,表示它无法解析Person
为符号(非常具有描述性)。
我从一个单独的教程中注意到,我制作的所有域类在文件旁边都有一个数据库图标,并适当地链接到控制器,而我的只有一个 Groovy 文件图标,其中类和变量名称显示为灰色到控制器的链接不存在。
我已经尝试过重建、刷新 Gradle、检查项目结构以使其类似于我的“工作”教程的项目结构,并运行项目以查看我是否只是错过了异常处理,它实际上是否按预期工作.
我使用 SDKMAN 作为 Java 8 open、Groovy 2.4.7 和 Grails 3.2.4 的环境管理器。
IntelliJ 的项目结构报告:Gradle: antlr:antlr:2.7.7
//Person class under the domain folder (and companyname folder and app folder)
package companyname.app
class Person {
String firstName
String lastName
int age
static constraints = {
}
}
// PersonController class where Person(params) is throwing the error
package compannyname.app
class PersonController {
def form() {
}
def save() {
def person = new Person(params) //This is where the IDE gets angry
person.save()
render "Success!"
}
def index() { }
}
运行该应用程序后,我预计在数据库控制台中无法查看任何引导数据new Person
(也显示为红色错误),但事实证明已保存。这也是可能的,因为注册为具有各自字段的数据库Person
下的类也可以在数据库控制台中查看。Domain
现在令人困惑的是 PersonController 的行为方式。登陆页面有一个“可用控制器”部分,其中显示了一个链接以重定向到http://localhost:8080/Person
并且不显示 html 表单,并显示与 IntelliJ 不同的错误:
URI
/Person
Class
java.lang.IllegalArgumentException
Message
Invalid action name: index
Trace
Line | Method
->> 186 | invoke in org.grails.core.DefaultGrailsControllerClass
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 90 | handle in org.grails.web.mapping.mvc.UrlMappingsInfoHandlerAdapter
| 963 | doDispatch . . . in org.springframework.web.servlet.DispatcherServlet
| 897 | doService in ''
| 970 | processRequest . in org.springframework.web.servl
我意识到Invalid action name: index
视图未正确映射到文件下可能是一个死的放弃UrlMappings
,但我迷失了,根据我在 Grails 的有限经验,不知道这是否与我遇到的主要问题有关.
解决方案
params.age 是String数据类型,但 Person.age 是Int数据类型。
使用数据绑定器
将字符串添加到对象和必要的类型(数据绑定)上。
// PersonController class where Person(params) is throwing the error
package compannyname.app
import grails.web.databinding.DataBinder
class PersonController {
def bindPerson = ['firstName','lastName','age']
def form() {
}
def save() {
Person person = new Person() //This is where the IDE gets angry
bindData(person, params, [include: bindPerson])
person.save()
render "Success!"
}
def index() { }
}
推荐阅读
- javascript - Javascript文本更改未在HTML“for”中修复
- java - 来自 JavaFX 桌面客户端应用程序的 RESTful API 身份验证
- node.js - 从以下 Firestore 列表中获取最新帖子
- python - Colab/Jupyter/Python:如何读取上传的文件
- video - MPEG-4 或 Matroska 是否可以实现可变分辨率?
- javascript - 在javascript函数中重新分配SASS变量,类似于用于CSS变量的setProperty?
- python - TensorFlow 仅使用 GPU0
- r - gheatmap 函数(ggtree 包)返回“错误:必须从色调调色板中请求至少一种颜色。” 绘制热图对象时
- python - 如何使用 BeautifulSoup 读取元素属性?
- android - 动画布局的 setRotation 属性