Problema na conversão de HashSet para List usando JSF EL

3 respostas
M

Caros amigos,

Em uma página de cadastro, utilizo um HashSet que armazena informações. Gostaria de utilizar um HashSet convertido em um List para que posso utilizá-lo na página em JSF, como mostra a linha abaixo:

<rich:comboBox  suggestionValues="#{cargoBean.listSetorString}"  value="#{cargoBean.cargo.aeSetors.settolist[0].nome}" style="font-size: 14px; height: 18px;"/>

Em “value”, “aeSetors” é o HashSet em questão. O “settolist” é um PropertyResolver que, internamente, realiza a determinada conversão, como mostra o código abaixo, disponível na internet:

import java.util.Set;

import javax.faces.el.EvaluationException;
import javax.faces.el.PropertyNotFoundException;
import javax.faces.el.PropertyResolver;

public class SetToListPropResolver extends PropertyResolver {

    private static String resolverWord = "settolist";

    private PropertyResolver originalResolver;

    public SetToListPropResolver(PropertyResolver propertyResolver) {
        this.originalResolver = propertyResolver;
    }

    public Object getValue(Object param1, Object param2) {
        if(param1 instanceof Set) {
            Set mySet = (Set) param1;

            if (resolverWord.equalsIgnoreCase((String) param2)) {
                return mySet.toArray();
            }
            else {
                throw new PropertyNotFoundException();
            }
        }
        else {
            return originalResolver.getValue(param1, param2);
        }
    }

    public Object getValue(Object param1, int param2) throws EvaluationException, PropertyNotFoundException {
        if (param1 instanceof Set) {
            throw new PropertyNotFoundException();
        }
        else {
            return originalResolver.getValue(param1, param2);
        }
    }

    public void setValue(Object param1, Object param2, Object param3) throws EvaluationException, PropertyNotFoundException {
        if (param1 instanceof Set) {
            throw new PropertyNotFoundException();
        }
        else {
            originalResolver.setValue(param1, param2, param3);
        }
    }

    public void setValue(Object param1, int param2, Object param3) throws EvaluationException, PropertyNotFoundException {
        if (param1 instanceof Set) {
            throw new PropertyNotFoundException();
        }
        else {
            originalResolver.setValue(param1, param2, param3);
        }
    }

    public boolean isReadOnly(Object param1, Object param2) throws EvaluationException, PropertyNotFoundException {
        if (param1 instanceof Set) {
            return true;
        }
        else {
            return originalResolver.isReadOnly(param1, param2);
        }
    }

    public boolean isReadOnly(Object param1, int param2) throws EvaluationException, PropertyNotFoundException {
        if (param1 instanceof Set) {
            return true;
        }
        else {
            return originalResolver.isReadOnly(param1, param2);
        }
    }

    public Class getType(Object param1, Object param2) throws EvaluationException, PropertyNotFoundException {
        if (param1 instanceof Set) {
            throw new PropertyNotFoundException();
        }
        else {
            return originalResolver.getType(param1, param2);
        }
    }

    public Class getType(Object param1, int param2) throws EvaluationException, PropertyNotFoundException {
        if (param1 instanceof Set) {
            throw new PropertyNotFoundException();
        }
        else {
            return originalResolver.getType(param1, param2);
        }
    }
}

Eu sei que EvaluationException, PropertyNotFoundException e PropertyResolver são DEPRECATED, mas na teoria e na prática deveria funcionar.

Quando rodo a aplicação, entro na página e realizo o referido cadastro, acontece o seguinte erro:

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: /paginas/usuario/admin/cargo/cadastrarCargo.xhtml @25,188 value="#{cargoBean.cargo.aeSetors.settolist[0].nome}": Target Unreachable, '0' returned null
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:256)
	org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)
	org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
	org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
	org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)

root cause

javax.el.PropertyNotFoundException: /paginas/usuario/admin/cargo/cadastrarCargo.xhtml @25,188 value="#{cargoBean.cargo.aeSetors.settolist[0].nome}": Target Unreachable, '0' returned null
	com.sun.facelets.el.TagValueExpression.getType(TagValueExpression.java:62)
	org.ajax4jsf.util.InputUtils.getConvertedValue(InputUtils.java:74)
	org.richfaces.renderkit.ComboBoxBaseRenderer.getConvertedValue(ComboBoxBaseRenderer.java:133)
	javax.faces.component.UIInput.getConvertedValue(UIInput.java:934)
	javax.faces.component.UIInput.validate(UIInput.java:860)
	javax.faces.component.UIInput.executeValidate(UIInput.java:1065)
	javax.faces.component.UIInput.processValidators(UIInput.java:666)
	javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1030)
	javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1030)
	org.ajax4jsf.component.UIAjaxForm.processValidators(UIAjaxForm.java:80)
	org.ajax4jsf.component.AjaxViewRoot$3.invokeContextCallback(AjaxViewRoot.java:442)
	org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:235)
	org.ajax4jsf.component.AjaxViewRoot.processValidators(AjaxViewRoot.java:458)
	com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:100)
	com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
	com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
	org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)
	org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
	org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
	org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)

Esta classe está corretamente configurada no faces-config.xml:

<application>
        <property-resolver>br.aesa.util.SetToListPropResolver</property-resolver>
    </application>

Pois, se não estivesse, nem teria rodado a aplicação.

Portanto, qual pode estar sendo o problema? Desde já agradeço a atenção de vocês.

Atenciosamente,

Magno

3 Respostas

gabrielhof

O construtor da classse ArrayList aceita como parametro um Collection.

No caso: return new ArrayList(hashSet);

M

gabrielhof:
O construtor da classse ArrayList aceita como parametro um Collection.

No caso: return new ArrayList(hashSet);

gabriel, essa solução não alterou nada, o mesmo problema continua…

Eu fiz um teste, alterei a linha:

value="#{cargoBean.cargo.aeSetors.settolist[0].nome}

para um valor que eu sabia que teria 100% de chance de pegar (uma outra variável da classe, que já tinha funcionado antes).

Isso significa que nenhuma classe está usando settolist, mas mesmo assim ele é chamado toda vez quando a aplicação roda por estar ativado na configuração do Hibernate, e o problema é: mesmo nenhuma classe utilizando settolist, ele continua dando o MESMO erro; ou seja, o erro está em outro lugar da classe, ou talvez até em outro lugar.

Espero que isso tenha ajudado a esclarecer mais o problema.

M

Ninguém?

Criado 3 de agosto de 2011
Ultima resposta 9 de ago. de 2011
Respostas 3
Participantes 2