Boa tarde
!!
To montando um form web com alguns combos que são construidos a partir de um Enum da seguinte forma:
public enum ExpressionsToSetupCamps {
intupText, multipleChoice, selection,
field, radioOrCheck, list, menu;
private String[] keys = {
"itemIntupText",
"itemMultipleChoice",
"itemSelection",
"itemField",
"itemRadioOrCheck",
"itemList",
"itemMenu"
};
public String toResourceKey() {
return keys[this.ordinal()];
}
public static ExpressionsToSetupCamps getExpressionsToSetupCamps(String value) {
if (value == null) {
throw new RuntimeException("valor null!");
}
int ordinal = Integer.parseInt(value);
switch (ordinal) {
case 0: return intupText;
case 1: return multipleChoice;
case 2: return selection;
case 3: return field;
case 4: return radioOrCheck;
case 5: return list;
case 6: return menu;
default:
throw new RuntimeException("Ordinal sem referencia com ExpressionsToSetupCamps!");
}
}
}
Os combos recebem uma lista construida a partir de um controlador central que recebe um intervalo referente ao enum acima:
protected List<SelectItem> createSelectList(Enum enum1, Enum enum2) {
ResourceBundle bundle = ResourceBundle.getBundle("form_bundle");
EnumSet<? extends Enum> enumSet = EnumSet.range(enum1, enum2);
List<SelectItem> list = new ArrayList<SelectItem>();
for (Enum enumType : enumSet) {
SelectItem selectItem = new SelectItem();
String key = ((ExpressionsToSetupCamps)enumType).toResourceKey();
selectItem.setLabel(bundle.getString(key));
selectItem.setValue("" + enumType.ordinal());
list.add(selectItem);
}
return list;
}
Construção das listas com base no metodo acima:
{
selectItemsType = createSelectList(
ExpressionsToSetupCamps.intupText, ExpressionsToSetupCamps.selection);
selectItemsField = createSelectList(
ExpressionsToSetupCamps.field, ExpressionsToSetupCamps.menu);
}
O codigo jsf fica assim:
<h:outputText value="#{attributeItem.model.field}" rendered="#{!attributeItem.editMode}" />
<h:selectOneMenu value="#{attributeItem.model.field}" rendered="#{attributeItem.editMode}" styleClass="input" >
<f:selectItems value="#{selectItemControl.selectItemsField}" />
</h:selectOneMenu>
Um detalhe, o atributo #{attributeItem.model.field} é um Enum do mesmo tipo do mostrado la em cima e que é convertido da seguinte forma:
public class ExpressionsToSetupCampsConverter extends Converter {
public Object getAsObject(FacesContext context, UIComponent component,
String value) throws ConverterException {
ExpressionsToSetupCamps type =
ExpressionsToSetupCamps.getExpressionsToSetupCamps(value);
return type;
}
public String getAsString(FacesContext context, UIComponent component,
Object object) throws ConverterException {
if (object instanceof String) {
return (String) object;
}
Enum type = (Enum) object;
int index = type.ordinal();
return "" + index;
}
}
<converter>
<converter-for-class>br.com.inovasoft.dto.ExpressionsToSetupCamps</converter-for-class>
<converter-class>br.com.inovasoft.web.converter.ExpressionsToSetupCampsConverter</converter-class>
</converter>
A renderização da página acontece sem problemas, os campos do tipo h:selectOneMenu são renderizados com o texto expecificado no resourceBundler de forma correta.
O problema ocorre quando se executa alguma outra ação no form que gere processamento no server como um h:commandLink, ou h:commandButton, a seguinte mensagem de erro aparece:
* j_id_jsp_1825541450_2:j_id_jsp_1825541450_22:0:j_id_jsp_1825541450_39: Validation Error: Value is not valid
* j_id_jsp_1825541450_2:j_id_jsp_1825541450_22:0:j_id_jsp_1825541450_48: Validation Error: Value is not valid
pensei que poderia ser algum problema no conversor mas o debug entra, converte de forma correta e retorna o objeto certo mas logo apos sair do converter esse erro é exibido :shock: .
Não sei qual o tipo de erro que possa ser esse por isso pesso socorro.
Por favor, caso alguem ja tenha passado pelo mesmo tipo de problema gostaria que me explica-se o que fez para solucionar pos eu to batendo cabeça e ate agora nada.
Obrigado e desde já agradeço … :!:
