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