调用服务时发生Grails空指针异常
我正在尝试调用我在控制器中创建的服务。 这是服务:调用服务时发生Grails空指针异常,grails,Grails,我正在尝试调用我在控制器中创建的服务。 这是服务: package matriculation import grails.transaction.Transactional import groovy.sql.Sql @Transactional class StudNamesService { def getNameById(String id) { return id } } 这是控制器的一部分 package matriculation imp
package matriculation
import grails.transaction.Transactional
import groovy.sql.Sql
@Transactional
class StudNamesService {
def getNameById(String id) {
return id
}
}
这是控制器的一部分
package matriculation
import static org.springframework.http.HttpStatus.*
import grails.transaction.Transactional
@Transactional(readOnly = true)
class MatrEntryController {
static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"]
def studNamesService
def getNameById(String id){
return studNamesService.getNameById(id)
}
}
当我调用调用服务的控制器内的方法时,我得到以下错误:
Class: java.lang.NullPointerException
Message: Request processing failed; nested exception is org.grails.gsp.GroovyPagesException: Error evaluating expression [cont.getNameById(matrEntryInstance.peopleCodeId)] on line [61]: Cannot invoke method getNameById() on null object
Caused by:Cannot invoke method getNameById() on null object
我对这个问题的代码做了最小的修改。正如您所看到的,控制器中的调用应该与服务的名称具有完全相同的名称。我正在运行Grails3.1.1
编辑1
这是调用该方法的GSP页面的一部分:
<%@ page import="matriculation.MatrEntryController" %>
<%
def cont=grailsApplication.classLoader.loadClass("matriculation.MatrEntryController").newInstance()
%>
<!----------------------Skip a few lines----------------------------->
<table>
<thead>
<tr>
<th id="cols">Options</th>
<g:sortableColumn property="peopleCodeId" title="People Code ID" id="cols"/>
<g:sortableColumn property="cadetName" title="Cadet Name" id="cols"/>
<g:sortableColumn property="soff" title="SOFF" id="cols"/>
<g:sortableColumn property="infirmary" title="Infirmary" id="cols"/>
<g:sortableColumn property="hsRotc" title="HS ROTC" id="cols"/>
<g:sortableColumn property="idfy" title="IDFY" id="cols"/>
<g:sortableColumn property="pao" title="Public Affairs" id="cols"/>
<g:sortableColumn property="busOffice" title="Business Office" id="cols"/>
<g:sortableColumn property="telephone" title="Telephone" id="cols"/>
<g:sortableColumn property="computer" title="Computer" id="cols"/>
<g:sortableColumn property="athletics" title="Athletics" id="cols"/>
<g:sortableColumn property="financialAid" title="Financial Aid" id="cols"/>
<g:sortableColumn property="compass" title="Compass" id="cols"/>
<g:sortableColumn property="regFlag" title="Registration Flag" id="cols"/>
<g:sortableColumn property="busOfficeForm" title="${raw('Business<br/>Office Form')}" id="cols"/>
</tr>
</thead>
<tbody>
<g:each in="${matrEntryList}" status="i" var="matrEntryInstance">
<tr class="${(i % 2) == 0 ? 'even' : 'odd'}">
<td id="cols">
<g:form resource="${matrEntryInstance}" method="DELETE">
<a href="${createLink(controller:'matrEntry',action:'show')+'/'+matrEntryInstance.id}" class="btn btn-default">Show</a>
<a href="${createLink(controller:'matrEntry',action:'edit')+'/'+matrEntryInstance.id}" class="btn btn-default">Edit</a>
</g:form>
</td>
<td id="cols">${matrEntryInstance.peopleCodeId}</td>
<td id="cols">${cont.getNameById(matrEntryInstance.peopleCodeId)}</td>
<td id="cols">${matrEntryInstance.soff}</td>
<td id="cols">${matrEntryInstance.infirmary}</td>
<td id="cols">${matrEntryInstance.hsRotc}</td>
<td id="cols">${matrEntryInstance.idfy}</td>
<td id="cols">${matrEntryInstance.pao}</td>
<td id="cols">${matrEntryInstance.busOffice}</td>
<td id="cols">${matrEntryInstance.telephone}</td>
<td id="cols">${matrEntryInstance.computer}</td>
<td id="cols">${matrEntryInstance.athletics}</td>
<td id="cols">${matrEntryInstance.financialAid}</td>
<td id="cols">${matrEntryInstance.compass}</td>
<td id="cols"><g:formatDate date="${matrEntryInstance.regFlag}" format="dd MMM, yyyy"/></td>
<td id="cols">${matrEntryInstance.busOfficeForm}</td>
</tr>
</g:each>
</tbody>
</table>
选择权
${matrEntryInstance.peopleCodeId}
${cont.getNameById(matrEntryInstance.peopleCodeId)}
${matrEntryInstance.soff}
${matrEntryInstance.医务室}
${matrEntryInstance.hsRotc}
${matrEntryInstance.idfy}
${matrEntryInstance.pao}
${matrEntryInstance.busOffice}
${matrEntryInstance.telephone}
${matrEntryInstance.computer}
${matrEntryInstance.athletics}
${matrEntryInstance.FinancialId}
${matrEntryInstance.compass}
${matrEntryInstance.busOfficeForm}
这里的问题是您以错误的方式处理问题。您不应该在GSP页面中创建控制器的实例。因为您要做的是调用服务,所以您应该真正考虑使用标记库
下面是一个简单的标记库示例,它可从GSP中使用:
package com.example
class ExampleTagLib {
static namespace = "myLookup"
def exampleService
def lookupName = { attrs, body ->
if (!attrs.id) return
out << exampleService.getNameById(attrs.id)
}
}
package.com.example
类ExampleTagLib{
静态名称空间=“myLookup”
def示例服务
def lookupName={attrs,body->
如果(!attrs.id)返回
查看GSP页面。它试图对模型中的某些内容调用该方法。发布GSP页面代码以获取更多帮助。
<td id="cols">${myLookup.lookupName(id: matrEntryInstance.peopleCodeId)}</td>