filterPane: Cannot invoke method filter() on null obect
27/01/2010 00:00
Grails Runtime Exception
Error Details
Error 500: Executing action [filter] of controller [rh.UnidadeController] caused exception: java.lang.NullPointerException: Cannot invoke method filter() on null object
Servlet: grails
URI: /intra.sic/grails/unidade/filter.dispatch
Exception Message: Cannot invoke method filter() on null object
Caused by: Executing action [filter] of controller [rh.UnidadeController] caused exception: java.lang.NullPointerException: Cannot invoke method filter() on null object
Class: script12646013848941137100088
At Line: [22]
Code Snippet:
Stack Trace
org.codehaus.groovy
package rh;
class Unidade {
String nome;
String sigla;
static mapping = {
table 'int_departamento'
id column: 'de_id'
nome column: 'de_nome'
sigla column: 'de_sigla'
version true
}
static constraints = {}
String toString() {
return this.sigla + " - " + this.nome;
}
}
package rh;
class UnidadeController {
def scaffold = Unidade;
}
<%=packageName ? "package ${packageName}\n\n" : ''%>class ${className}Controller {
// Plugin filterPane
def filterService;
static allowedMethods = [save: "POST", update: "POST", delete: "POST"]
def index = {
redirect(action: "list", params: params)
}
def list = {
params.max = Math.min(params.max ? params.int('max') : 10, 100)
[${propertyName}List: ${className}.list(params), ${propertyName}Total: ${className}.count()]
}
def filter = {
params.max = Math.min(params.max ? params.int('max') : 10, 100);
render( view:'list',
model:[ ${propertyName}List: filterService.filter( params, ${className} ),
${propertyName}Total: filterService.count( params, ${className} ),
filterParams: com.zeddware.grails.plugins.filterpane.FilterUtils.extractFilterParams(params),
params:params ] )
}
def create = {
...
}
<% import grails.persistence.Event %>
<%=packageName%>
<%
String sPackageAndClassName = className;
if(packageName.length()>0) {
sPackageAndClassName = domainClass.packageName + "." + className;
}
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="layout" content="main" />
<g:set var="entityName" value="\${message(code: '${domainClass.propertyName}.label', default: '${className}')}" />
<title><g:message code="default.list.label" args="[entityName]" /></title>
<filterpane:includes />
</head>
<body>
<div class="nav">
<span class="menuButton"><a class="home" href="\${createLink(uri: '/')}">Home</a></span>
<span class="menuButton"><g:link class="create" action="create"><g:message code="default.new.label" args="[entityName]" /></g:link></span>
</div>
<div class="body">
<h1><g:message code="default.list.label" args="[entityName]" /></h1>
<g:if test="\${flash.message}">
<div class="message">\${flash.message}</div>
</g:if>
<filterpane:filterPane domainBean="${sPackageAndClassName}"
additionalProperties="id"
associatedProperties=""
excludeProperties=""
filterPropertyValues=""
titleKey="fp.tag.filterPane.titleText"/>
<filterpane:filterButton text="" />
<div class="list">
<table>
<thead>
<tr>
<% excludedProps = Event.allEvents.toList() << 'version'
props = domainClass.properties.findAll { !excludedProps.contains(it.name) && it.type != Set.class }
Collections.sort(props, comparator.constructors[0].newInstance([domainClass] as Object[]))
props.eachWithIndex { p, i ->
if (i < 6) {
if (p.isAssociation()) { %>
<th><g:message code="${domainClass.propertyName}.${p.name}.label" default="${p.naturalName}" /></th>
<% } else { %>
<g:sortableColumn params="\${filterParams}" property="${p.name}" title="\${message(code: '${domainClass.propertyName}.${p.name}.label', default: '${p.naturalName}')}" />
<% } } } %>
</tr>
</thead>
<tbody>
<g:each in="\${${propertyName}List}" status="i" var="${propertyName}">
<tr class="\${(i % 2) == 0 ? 'odd' : 'even'}">
<% props.eachWithIndex { p, i ->
cp = domainClass.constrainedProperties[p.name]
if (i == 0) { %>
<td><g:link action="show" id="\${${propertyName}.id}">\${fieldValue(bean: ${propertyName}, field: "${p.name}")}</g:link></td>
<% } else if (i < 6) {
if (p.type == Boolean.class || p.type == boolean.class) { %>
<td><g:formatBoolean boolean="\${${propertyName}.${p.name}}" /></td>
<% } else if (p.type == Date.class || p.type == java.sql.Date.class || p.type == java.sql.Time.class || p.type == Calendar.class) { %>
<td><g:formatDate date="\${${propertyName}.${p.name}}" /></td>
<% } else { %>
<td>\${fieldValue(bean: ${propertyName}, field: "${p.name}")}</td>
<% } } } %>
</tr>
</g:each>
</tbody>
</table>
</div>
<div class="paginateButtons">
<g:paginate total="\${${propertyName}Total == null ? ${sPackageAndClassName}.count(): ${propertyName}Total}" params="\${filterParams}" />
</div>
</div>
</body>
</html>
Se eu coloco a action "filter" no controlador UnidadeController tudo funciona, sem problemas.
class UnidadeController extends utils.BaseController {
def scaffold = Unidade;
}
package utils
class BaseController {
// Plugin filterPane
def filterService;
}
Para se registrar, clique aqui.