我是grails的新手,我收到此错误:无法在null对象上获取属性'id' 我正在尝试创建一个Web应用程序,除了添加新的灯具外,还显示灯具。但是,在运行应用程序时,我无法添加灯具或显示处理添加灯具的页面,即add.gsp。以下是我的应用程序中当前可用的类。
这是我简单的Fixture域类:
package cricketfixturesgrailsapp
class Fixture {
Date date
String venue
// hasMany = [scores:Scores]
static hasMany = [team:Team]
static constraints = {
}
}
这是我的夹具控制器类:
package cricketfixturesgrailsapp
class FixtureController {
//def index() { }
def FixtureService
def add() {
if (request.method == 'GET') {
[fixtureBean: new Fixture()]
}
else {
def fixture = FixtureService.createFixture(params.fixture?.date, params.fixture?.venue)
if (!fixture.hasErrors()) {
redirect action: 'show', id: fixture.id
return
}
[fixtureBean: fixture]
}
}
def show() {
def fixture = Fixture.get(params.id)
if (fixture) {
[fixtureBean: fixture]
}
}
def find() {
if (request.method == 'POST') {
def fixtures = Fixture.findAllByDate(params.date)
if (fixtures) {
if (fixtures.size() > 1) {
render view: 'selection', model: [fixtures: fixtures]
}
else {
redirect action: 'show', id: fixtures[0].id
}
}
else {
[message: 'fixtures.not.found']
}
}
}
}
我已经创建了一个fixtureService来处理灯具的创建和更新
package cricketfixturesgrailsapp
import grails.transaction.Transactional
//@Transactional
class FixtureService {
//def serviceMethod() {
Fixture createFixture(Date date, String venue)
{
def fixture = new Fixture(date: date, venue:venue)
fixture.save()
fixture
}
void updateFixture(Fixture fixture,Date date, String venue)
{
fixture.date = date
fixture.venue = venue
fixture.save()
}
Team createTeam(String teamName1, String teamName2, long fixtureId){
def team = new Team(teamName1: teamName1, teamName2: teamName2, fixture: Fixture.load(fixtureId))
team.save()
team
}
void updateTeam(String teamName1, String teamName2, long fixtureId) {
team.teamName1 = teamName1
team.teamName2 = teamName2
team.fixture = Fixture.load(fixtureId)
team.save()
}
}
表单
的formfield.gsp${label}: <span class="errors"><g:fieldError bean="${bean}" field="${field}" /></span>
<br/>
<g:textField name="${name + '.' +field}" value="${fieldValue(bean:bean, field:field)}" />
另外我创建了3个gsp文件,添加添加夹具,查找,找到场地夹具并显示哪个显示夹具,这里是3个gsp文件:
添加gsp
<!--
To change this license header, choose License Headers in Project Properties.
<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Add fixture</title>
</head>
<body>
<h2><g:if test="${!fixtureBean.id}">New </g:if>Fixture:</h2>
<g:form action="${ fixture.id ? 'edit' : 'add'}" id="${fixtureBean?.id}">
<table>
<tr>
<th>
<g:render template="/common/formField"
model="[name:'fixture', bean:fixtureBean, field:'date', label:'Date']" />
</th>
</tr>
<tr>
<th>
<g:render template="/common/formField"
model="[name:'fixture', bean:fixtureBean, field:'venue', label:'Venue']" />
</th>
</tr>
<tr>
<td>
<p><input type="submit" value="${ fixtureBean.id ? 'Update' : 'Add'} Fixture"/></p>
</td>
</tr>
</table>
</g:form>
</body>
</html>
</body>
</html>
find.gsp
<html>
<head>
<meta name="layout" content="main">
<title>Find fixtures</title>
</head>
<body id="find">
<h2>Find fixtures:</h2>
<g:form action="find">
<table>
<tr>
<th>
venue
<br/>
<g:textField name="venue"/>
<span class="errors"><g:message code="${message}"></g:message></span>
</th>
</tr>
<tr>
<td><p class="submit"><input type="submit" value="Find fixtures"/></p></td>
</tr>
</table>
</g:form>
<br/>
<g:link controller="Fixture" action="add">Add fixture</g:link></a>
</body>
</html>
show.gsp
<html>
<head>
<meta name="layout" content="main">
<title>fixture Information</title>
</head>
<body id="show">
<h2>fixture Information</h2>
<table>
<tr>
<th>Date</th>
<td><b>${fixtureBean.date} ${fixtureBean.venue}</b></td>
</tr>
</table>
</body>
</html>
此外,我的默认主页是index.gsp,用户需要点击链接查找灯具,这样才能添加灯具
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Sample title</title>
</head>
<body>
<h2><g:message code="welcome"/></h2>
<ul>
<li><g:link controller="Fixture" action="add">Find fixture</g:link></li>
</ul>
</body>
</html>
栈跟踪
....Error
|
2014-02-23 20:35:23,016 [http-bio-8080-exec-8] ERROR errors.GrailsExceptionResolver - NullPointerException occurred when processing request: [GET] /CricketFixturesGrailsApp/fixture/add
Cannot get property 'id' on null object. Stacktrace follows:
Message: Error evaluating expression [fixture.id ? 'edit' : 'add'] on line [20]: Cannot get property 'id' on null object
Line | Method
->> 20 | doCall in C:/apache-tomcat-7.0.50/webapps/CricketFixturesGrailsApp/grails-app/views/fixture/add.gsp
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Caused by NullPointerException: Cannot get property 'id' on null object
->> 44 | doCall in C__apache_tomcat_7_0_50_webapps_CricketFixturesGrailsApp_grails_app_views_fixture_add_gsp$_run_closure2_closure8
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 47 | run in C__apache_tomcat_7_0_50_webapps_CricketFixturesGrailsApp_grails_app_views_fixture_add_gsp
| 200 | doFilter in grails.plugin.cache.web.filter.PageFragmentCachingFilter
| 63 | doFilter in grails.plugin.cache.web.filter.AbstractFilter
| 1110 | runWorker in java.util.concurrent.ThreadPoolExecutor
| 603 | run in java.util.concurrent.ThreadPoolExecutor$Worker
^ 722 | run . . . in java.lang.Thread
答案 0 :(得分:5)
我相信你从下面的代码部分得到了错误。
def fixture = FixtureService.createFixture(params.fixture?.date,
params.fixture?.venue)
if (!fixture.hasErrors()) {
redirect action: 'show', id: fixture.id //issue here
return
}
bean(在这种情况下为FixtureService
)应该注入:
def fixtureService //lower case
因此,fixtureService
不按照现在使用的方式注入。这是我的预期,直到错误的完整堆栈跟踪添加到问题中。无论如何都必须修复此(服务类注入)。
答案 1 :(得分:0)
这是我要做的: 一旦你有了域,我也会生成控制器和gsp页面。会提供什么?
首先,您将拥有一个带有实际代码的控制器,而不是“scaffold = true”。 How to generate
其次,您将能够修改/添加功能到控制器和正在工作的gsp页面,逐渐改变行为&amp;验证每一步。