Erro utilizando TreeNode (Primefaces)

Olá pessoal
Estou estudando JSF com o livro Programação Java para a Web, que aliás, é um excelente livro. Eu concluí o capítulo 9, que aborda o Primefaces, utilizando o TreeNode para exibir categorias.
Bom, tudo rodou legal, eu abri a tree, aí quando seleciona um item, o formulário de edição deve ser habilitado. E funcionou, porém…
Quando eu clico uma vez no item, aparece um erro no console do eclipse. Se eu clico duas vezes, o item é disponibilizado para edição.
Mas, como eu disse, ao selecionar o item com um clique, aparece um erro, e o efeito do primefaces até funciona incorretamente, ficando azul, ao invés de verde (como deveria ficar), como se algo tivesse sido interrompido
Eu consegui aprender muito com esse livro até agora, porém em relação a esse erro, estou tentando descobrir o que é, e to apanhando bastante
Enfim, segue o erro a seguir:

Jul 19, 2013 11:09:11 PM org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() for servlet Faces Servlet threw exception java.lang.NullPointerException at org.primefaces.component.tree.Tree.processUpdates(Tree.java:308) at javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1289) at javax.faces.component.UIViewRoot.processUpdates(UIViewRoot.java:1254) at com.sun.faces.lifecycle.UpdateModelValuesPhase.execute(UpdateModelValuesPhase.java:78) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:646) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:344) at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:110) at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356) at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:98) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356) at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:95) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356) at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:79) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356) at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:120) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356) at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:55) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356) at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:36) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356) at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:188) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356) at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:106) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356) at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356) at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:150) at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at financeiro.web.filter.ConexaoHibernateFilter.doFilter(ConexaoHibernateFilter.java:24) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Thread.java:724)

A seguir segue a página xhtml correspondente ao gerenciamento de categorias (que contém o tree):

[code]<?xml version="1.0" encoding="ISO-8859-1"?>

<ui:composition template="/templates/interna.xhtml">
<ui:define name=“titulo”>
Categorias
</ui:define>

<ui:define name="corpo">
	<f:view contentType="text/html">
		<h:panelGrid columns="2" cellpadding="5">
			<h:panelGroup>
				<h:form>
					<p:commandButton value="Novo" action="#{categoriaBean.novo}" update="edicao" />
				</h:form>
				<br />
				<h:form id="arvore">
					<p:tree value="#{categoriaBean.categoriasTree}" var="node"
						dynamic="false" 
						selectionMode="single"
						nodeSelectListener="#{categoriaBean.selecionar}"
						update="edicao"
						expandAnim="FADE_IN" collapseAnim="FADE_OUT">
						<p:treeNode>
							<h:outputText value="#{node.descricao}" />
						</p:treeNode>
					</p:tree>
				</h:form>
			</h:panelGroup>
			
			<h:panelGroup id="edicao">
				<h:messages />
				<h:form rendered="#{categoriaBean.mostraEdicao}">
					<h:inputHidden value="#{categoriaBean.editada.codigo}" />
					<h:inputHidden value="#{categoriaBean.editada.fator}" />
					<h:panelGrid columns="2">
						<h:outputLabel value="Pai" />
						<h:selectOneMenu value="#{categoriaBean.editada.pai}">
							<f:selectItems value="#{categoriaBean.categoriasSelect}" />
						</h:selectOneMenu>
						<h:outputLabel value="Descrição" />
						<h:inputText value="#{categoriaBean.editada.descricao}" />
						<h:outputText />
						<h:panelGroup>
							<p:commandButton value="Salvar" action="#{categoriaBean.salvar}" 
								update="edicao, arvore" />
							<p:commandButton value="Excluir" action="#{categoriaBean.excluir}" 
								update="edicao, arvore" />
						</h:panelGroup>
						<h:outputText />
						<p:commandButton value="Nova subcategoria" action="#{categoriaBean.novo}" 
							update="edicao" />
					</h:panelGrid>
				</h:form>
			</h:panelGroup>
		</h:panelGrid>
	</f:view>
</ui:define>

</ui:composition>

[/code]

A classe mapeada (Categoria):

[code]@Entity
public class Categoria implements Serializable {

private static final long serialVersionUID = -4996563889965803475L;


@Id
@GeneratedValue
private Integer codigo;

@ManyToOne
@JoinColumn(name = "categoriaPai", nullable = true)
@ForeignKey(name = "fkCategoriaCategoria")
private Categoria pai;

@ManyToOne
@JoinColumn(name = "usuario")
@OnDelete(action=OnDeleteAction.CASCADE)
@ForeignKey(name = "fkCategoriaUsuario")
private Usuario usuario;

private String descricao;

private int fator;

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.REMOVE)
@JoinColumn(name = "categoriaPai", updatable = false)
@OrderBy(value="descricao asc")
private List<Categoria> filhos;

public Categoria() { }

public Categoria(Categoria pai, Usuario usuario, String descricao, int fator) {
	this.pai = pai;
	this.usuario = usuario;
	this.descricao = descricao;
	this.fator = fator;
}

public Integer getCodigo() {
	return codigo;
}

public void setCodigo(Integer codigo) {
	this.codigo = codigo;
}

public Categoria getPai() {
	return pai;
}

public void setPai(Categoria pai) {
	this.pai = pai;
}

public Usuario getUsuario() {
	return usuario;
}

public void setUsuario(Usuario usuario) {
	this.usuario = usuario;
}

public String getDescricao() {
	return descricao;
}

public void setDescricao(String descricao) {
	this.descricao = descricao;
}

public int getFator() {
	return fator;
}

public void setFator(int fator) {
	this.fator = fator;
}

public List<Categoria> getFilhos() {
	return filhos;
}

public void setFilhos(List<Categoria> filhos) {
	this.filhos = filhos;
}

public static long getSerialversionuid() {
	return serialVersionUID;
}

@Override
public int hashCode() {
	final int prime = 31;
	int result = 1;
	result = prime * result + ((codigo == null) ? 0 : codigo.hashCode());
	return result;
}

@Override
public boolean equals(Object obj) {
	if (this == obj)
		return true;
	if (obj == null)
		return false;
	if (getClass() != obj.getClass())
		return false;
	Categoria other = (Categoria) obj;
	if (codigo == null) {
		if (other.codigo != null)
			return false;
	} else if (!codigo.equals(other.codigo))
		return false;
	return true;
}

}[/code]

Sendo que, tenho um Converter para ela, para manipular a categoria de Object pra String, e vice versa, a seguir:

[code]@FacesConverter(forClass = Categoria.class)
public class CategoriaConverter implements Converter {

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
	if (value != null && value.trim().length() > 0) {
		Integer codigo = Integer.valueOf(value);
		try {
			CategoriaRN categoriaRN = new CategoriaRN();
			return categoriaRN.carregar(codigo);
		}
		catch (Exception e) {
			throw new ConverterException("Não foi possível encontrar a categoria de código " + value + ". " + e.getMessage());
		}
	}
	return null;
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
	if (value != null) {
		Categoria categoria = (Categoria) value;
		return categoria.getCodigo().toString();
	}
	return "";
}

}[/code]

Enfim, se precisarem de mais algum dos códigos é só falar
Quero descobrir o que significa esse erro, e se alguém puder me ajudar a esclarecer isso, agradeço muito


jvkirk