filterPane: Cannot invoke method filter() on null obect
27/01/2010 00:00
0
pessoal, e estou tentando utilizar o plugin filterPane.
segui os passos para utilização e deu certo.
Entretanto, para isso eu tive que colocar em CADA classe controller a action filter.
Como uso o plugin template eu pensei em colocar a action filter no template scaffolding/Controller.groovy

Entretanto, ao executar a aplicação eu recebo a seguinte mensagem de erro:
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


A minha classe de domínio está dentro de um pacote chamdo "rh" e chama-se "Unidade", então tenho "rh.Unidade".
Há um detalhe importante: quando eu mando o Grails gerar o código do controller "grails generate-controller rh.Unidade" o erro não acontece.

Estou colocando a seguir os meus códigos.
Caso alguém possa me auxiliar, ficarei grato.

Classe de domínio:
ARQUIVO: /grails-app/domain/rh/Unidade.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;
}
}


Classe de controle:
ARQUIVO: /grails-app/controllers/rh/UnidadeController.groovy
package rh;
class UnidadeController {
def scaffold = Unidade;
}


ARQUIVO: /src/templates/scaffolding/Controller.groovy :
<%=packageName ? &quot;package ${packageName}\n\n&quot; &#58; ''%>class ${className}Controller {

// Plugin filterPane
def filterService;

static allowedMethods = [save&#58; &quot;POST&quot;, update&#58; &quot;POST&quot;, delete&#58; &quot;POST&quot;]

def index = {
redirect(action&#58; &quot;list&quot;, params&#58; params)
}

def list = {
params.max = Math.min(params.max ? params.int('max') &#58; 10, 100)
[${propertyName}List&#58; ${className}.list(params), ${propertyName}Total&#58; ${className}.count()]
}

def filter = {
params.max = Math.min(params.max ? params.int('max') &#58; 10, 100);
render( view&#58;'list',
model&#58;[ ${propertyName}List&#58; filterService.filter( params, ${className} ),
${propertyName}Total&#58; filterService.count( params, ${className} ),
filterParams&#58; com.zeddware.grails.plugins.filterpane.FilterUtils.extractFilterParams(params),
params&#58;params ] )
}

def create = {
...
}



ARQUIVO: /src/templates/scaffolding/list.gsp
<% import grails.persistence.Event %>
<%=packageName%>
<%
String sPackageAndClassName = className;
if(packageName.length()>0) {
sPackageAndClassName = domainClass.packageName + &quot;.&quot; + className;
}
%>
<html>
<head>
<meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot; />
<meta name=&quot;layout&quot; content=&quot;main&quot; />
<g&#58;set var=&quot;entityName&quot; value=&quot;\${message(code&#58; '${domainClass.propertyName}.label', default&#58; '${className}')}&quot; />
<title><g&#58;message code=&quot;default.list.label&quot; args=&quot;[entityName]&quot; /></title>
<filterpane&#58;includes />
</head>
<body>
<div class=&quot;nav&quot;>
<span class=&quot;menuButton&quot;><a class=&quot;home&quot; href=&quot;\${createLink(uri&#58; '/')}&quot;>Home</a></span>
<span class=&quot;menuButton&quot;><g&#58;link class=&quot;create&quot; action=&quot;create&quot;><g&#58;message code=&quot;default.new.label&quot; args=&quot;[entityName]&quot; /></g&#58;link></span>
</div>
<div class=&quot;body&quot;>
<h1><g&#58;message code=&quot;default.list.label&quot; args=&quot;[entityName]&quot; /></h1>
<g&#58;if test=&quot;\${flash.message}&quot;>
<div class=&quot;message&quot;>\${flash.message}</div>
</g&#58;if>
<filterpane&#58;filterPane domainBean=&quot;${sPackageAndClassName}&quot;
additionalProperties=&quot;id&quot;
associatedProperties=&quot;&quot;
excludeProperties=&quot;&quot;
filterPropertyValues=&quot;&quot;
titleKey=&quot;fp.tag.filterPane.titleText&quot;/>
<filterpane&#58;filterButton text=&quot;&quot; />
<div class=&quot;list&quot;>
<table>
<thead>
<tr>
<% excludedProps = Event.allEvents.toList() << 'version'
props = domainClass.properties.findAll { !excludedProps.contains(it.name) &amp;&amp; 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&#58;message code=&quot;${domainClass.propertyName}.${p.name}.label&quot; default=&quot;${p.naturalName}&quot; /></th>
<% } else { %>
<g&#58;sortableColumn params=&quot;\${filterParams}&quot; property=&quot;${p.name}&quot; title=&quot;\${message(code&#58; '${domainClass.propertyName}.${p.name}.label', default&#58; '${p.naturalName}')}&quot; />
<% } } } %>
</tr>
</thead>
<tbody>
<g&#58;each in=&quot;\${${propertyName}List}&quot; status=&quot;i&quot; var=&quot;${propertyName}&quot;>
<tr class=&quot;\${(i % 2) == 0 ? 'odd' &#58; 'even'}&quot;>
<% props.eachWithIndex { p, i ->
cp = domainClass.constrainedProperties[p.name]
if (i == 0) { %>
<td><g&#58;link action=&quot;show&quot; id=&quot;\${${propertyName}.id}&quot;>\${fieldValue(bean&#58; ${propertyName}, field&#58; &quot;${p.name}&quot;)}</g&#58;link></td>
<% } else if (i < 6) {
if (p.type == Boolean.class || p.type == boolean.class) { %>
<td><g&#58;formatBoolean boolean=&quot;\${${propertyName}.${p.name}}&quot; /></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&#58;formatDate date=&quot;\${${propertyName}.${p.name}}&quot; /></td>
<% } else { %>
<td>\${fieldValue(bean&#58; ${propertyName}, field&#58; &quot;${p.name}&quot;)}</td>
<% } } } %>
</tr>
</g&#58;each>
</tbody>
</table>
</div>
<div class=&quot;paginateButtons&quot;>
<g&#58;paginate total=&quot;\${${propertyName}Total == null ? ${sPackageAndClassName}.count()&#58; ${propertyName}Total}&quot; params=&quot;\${filterParams}&quot; />
</div>
</div>
</body>
</html>



OBSERVAÇÃO IMPORTANTE:
Se eu coloco a action &quot;filter&quot; no controlador UnidadeController tudo funciona, sem problemas.


Eu preciso de ajuda.

É isso aí pessoal, se alguém precisar de mais detalhes é só falar.

Valeu, Weber.
Tags: Ferramentas/Plugins


0
Pessoal, realmente, não descobri o porquê de o Grails não &quot;enxergar&quot; as novas closures que adicionao no Template do controlador.
Pare resolver o problema, fiz com que todos os meus controladores herdem de uma classe que contém as closures que preciso.

O código da classe controladora de Unidade ficou assim:
class UnidadeController extends utils.BaseController {
def scaffold = Unidade;
}


A classe utils.BaseController possui o seguinte conteúdo:
package utils
class BaseController {

// Plugin filterPane
def filterService;
}


É isso aí.
Mais um problema resolvido.
02/06/2010 00:00



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto