grails - GGTS空指针异常

标签 grails spring-data spring-jdbc spring-tool-suite

我是这里的新手,希望我能对此做详尽的解释。

使用Groovy Grails工具套件-GGTS(又名Spring工具套件-STS)来研究《行动中的Grails》第二版。

GGTS版本3.6.4。 Grails版本2.4.4

我仍在第1章上。这一次,我已经在数据库中添加了几个“引号”。当我通过Grails控制台执行“println Quote.count()”时,我看到有4个引号。

我尝试运行我的随机GSP并收到以下错误:

Line | Method
->>    7 | doCall    in C:/Users/donahujc/Documents/workspace-ggts-3.6.4.RELEASE/qotd/grails-app/views/quote/random.gsp
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

Caused by NullPointerException: Cannot get property 'content' on null object**
->>    7 | doCall    in C__Users_donahujc_Documents_workspace_ggts_3_6_4_RELEASE_qotd_grails_app_views_quote_random_gsp$_run_closure2_closure4
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|     10 | run       in C__Users_donahujc_Documents_workspace_ggts_3_6_4_RELEASE_qotd_grails_app_views_quote_random_gsp
|    198 | doFilter  in PageFragmentCachingFilter.java
|     63 | doFilter  in AbstractFilter.java
|   1142 | runWorker in java.util.concurrent.ThreadPoolExecutor
|    617 | run       in java.util.concurrent.ThreadPoolExecutor$Worker
^    745 | run . . . in java.lang.Thread

这告诉我的是我的电话没有指向任何对象。因此,我进入了DBConsole后端,当然,我的Quote表(包含Content和Author)不存在。

当我的DataSource.groovy文件更改为以下内容时,怎么可能:
// environment specific settings
environments {
    development {
        dataSource {
            dbCreate = "update" // one of 'create', 'create-drop', 'update', 'validate', ''
            url = "jdbc:h2:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE"

我将“create-drop”更改为“update”,并删除了对内存(mem :)的引用。

我知道数据在那里,因为我可以使用Grails控制台查询它。

复杂的部分是我无法一次浏览全部。因此,我不得不在几天之内多次关闭并重新启动GGTS。我认为重新运行应用程序会重新初始化表,但事实并非如此。

如何初始化此表?我尝试添加新的报价。 (以某种方式,我的索引从引用#4到引用#33。)但仍然没有可供我的GSP使用的表格。

我对如何初始化此表(以及其中的数据)一无所知。这将是我一直遇到的问题,因为我将不断关闭/重新打开GGTS。

救命

编辑:(添加更多我的代码)

报价 Controller :
def random(){
        def allQuotes = Quote.list()
        def randomQuote
        if (allQuotes.size() > 0){
            def randomIdx = new Random().nextInt(allQuotes.size())
        }else {
            randomQuote = new Quote(author:"Anonymous",
                content:"Real Programmers double peace out on quiche")
        }
        [quote:randomQuote]

    }

随机
<html>
<head>
<title>Random Quote</title> 
</head>
<body>
<div id="quote">
<q>${quote.content}</q>
<p>${quote.author}</p>
</div>
</body>
</html>

Quote.groovy
class Quote {

    String author
    String content
    Date created = new Date()

    static constraints = {
    }
}

到目前为止,一切都很好。我知道我的数据在数据库中,因为我可以从Grails控制台查询它。但是数据库控制台甚至不显示我的Quote表:(

最佳答案

如果实际上这是您正在使用的代码:),您将踢自己。请注意,Groovy中的未初始化变量的默认值是null。因此,randomQuote操作中random变量的初始值为null

然后将randomQuote变量的值分配给 View 模型中的quote变量。看一下 View ,我可以知道NullPointerException表达式正在抛出${quote.content}。因此,如果quote在模型中为null,则必须表示randomQuote在操作中为null

那么,当数据库中有引号时会发生什么呢?该 Action 采用以下分支:

if (allQuotes.size() > 0) {
    def randomIdx = new Random().nextInt(allQuotes.size())
}

如您所见,没有给randomQuote变量赋值,因此它仍然是null。本书 list 1.3中的代码具有以下内容:
if (allQuotes.size() > 0) {
    def randomIdx = new Random().nextInt(allQuotes.size())
    randomQuote = allQuotes[randomIdx]
}

或者至少我希望如此。它显示在我的PDF版本中。

这有点费劲,但是我希望您能遵循这个推理并将其用于诊断遇到的其他问题。我认识到,对于新来者来说,解释他们遇到的各种错误并不总是那么容易。

关于grails - GGTS空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31415758/

相关文章:

java - 如何动态添加参数值到JdbcTemplate查询?

mysql - HTTP Status 500 - 请求处理失败;嵌套异常是

grails - GSP 页面中的递归

grails - 是否仍然可以在Grails中安装全局插件

grails - 使用Domain.load()代理替代Domain CRUD方法

java - Spring Data - MongoDB 按给定顺序按 ID 获取对象

spring - 无法导入Spring RepositoryRestResource

java - 为什么我尝试在 Spring Boot 应用程序上配置数据库连接时会出现此异常?创建名称为 'dataSource' 的 bean 时出错

mongodb - Grails 3-MongoDB的GORM-副本集的最近读取

java - jhipster,Java端的管理员角色识别