2016-12-12 16 views
1

コントローラで作成したサービスを呼び出そうとしています。 これはサービスです。サービスを呼び出すときのGrails Nullポインタの例外

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 

私はこの質問のコードを少し変更しました。ご覧のように、コントローラの呼び出しは、サービスの名前とまったく同じ名前になります。

<%@ 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> 
+0

GSPページをご覧ください。そのメソッドをモデルから何かに呼び出そうとしています。 GSPページコードを投稿して、より多くのヘルプを入手してください。 –

答えて

2

ここでの問題は、あなたが間違った方法で問題に近づいているということです。私は、このメソッドを呼び出しているGSPページの一部であるGrailsの3.1.1

編集1 を実行しています。 ではなく、はGSPページにコントローラのインスタンスを作成する必要があります。あなたが探しているのはサービスを呼び出すことなので、代わりにタグライブラリを使って見てください。ここで

は、タグライブラリの簡単な例であり、それはあなたの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) 
    } 
} 

使用は次のようになります。

<td id="cols">${myLookup.lookupName(id: matrEntryInstance.peopleCodeId)}</td> 

私は非常にdocumentation用を読むことをお勧めしますこれを試す前にタグライブラリを作成してください。

関連する問題