Apenas o N fica checked, na minha tela eu mudo o valor da seleção mas qdo vejo no MBean, só aparece o N.
ProtocoloBean.protocolo.flgSie é um campo String.
package br.com.ufu.prograd.siprot.converters;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.faces.component.UIComponent;
import javax.faces.component.UISelectItem;
import javax.faces.component.UISelectItems;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.model.SelectItem;
import javax.faces.model.SelectItemGroup;
public class SimpleIndexConverter implements Converter {
private int index = -1;
public Object getAsObject(FacesContext ctx, UIComponent component, String value) {
SelectItem selectedItem = this.getSelectedItemByIndex(component, Integer.parseInt(value));
if (selectedItem != null)
return selectedItem.getValue();
return null;
}
public String getAsString(FacesContext ctx, UIComponent component, Object value) {
index++;
return String.valueOf(index);
}
/**
* Obtem o SelecItem de acordo com a opção selecionada pelo usuário
*/
protected SelectItem getSelectedItemByIndex(UIComponent component, int index) {
List<SelectItem> items = this.getSelectItems(component);
int size = items.size();
if (index > -1
&& size > index) {
return items.get(index);
}
return null;
}
protected List<SelectItem> getSelectItems(UIComponent component) {
List<SelectItem> items = new ArrayList<SelectItem>();
int childCount = component.getChildCount();
if (childCount == 0)
return items;
List<UIComponent> children = component.getChildren();
for (UIComponent child : children) {
if (child instanceof UISelectItem) {
this.addSelectItem((UISelectItem) child, items);
} else if (child instanceof UISelectItems) {
this.addSelectItems((UISelectItems) child, items);
}
}
return items;
}
protected void addSelectItem(UISelectItem uiItem, List<SelectItem> items) {
boolean isRendered = uiItem.isRendered();
if (!isRendered) {
items.add(null);
return;
}
Object value = uiItem.getValue();
SelectItem item;
if (value instanceof SelectItem) {
item = (SelectItem) value;
} else {
Object itemValue = uiItem.getItemValue();
String itemLabel = uiItem.getItemLabel();
// JSF throws a null pointer exception for null values and labels,
// which is a serious problem at design-time.
item = new SelectItem(itemValue == null ? "" : itemValue,
itemLabel == null ? "" : itemLabel, uiItem
.getItemDescription(), uiItem.isItemDisabled());
}
items.add(item);
}
@SuppressWarnings("unchecked")
protected void addSelectItems(UISelectItems uiItems, List<SelectItem> items) {
boolean isRendered = uiItems.isRendered();
if (!isRendered) {
items.add(null);
return;
}
Object value = uiItems.getValue();
if (value instanceof SelectItem) {
items.add((SelectItem) value);
} else if (value instanceof Object[]) {
Object[] array = (Object[]) value;
for (int i = 0; i < array.length; i++) {
// TODO test - this section is untested
if (array[i] instanceof SelectItemGroup) {
resolveAndAddItems((SelectItemGroup) array[i], items);
} else {
items.add((SelectItem) array[i]);
}
}
} else if (value instanceof Collection) {
Iterator<SelectItem> iter = ((Collection<SelectItem>) value)
.iterator();
SelectItem item;
while (iter.hasNext()) {
item = iter.next();
if (item instanceof SelectItemGroup) {
resolveAndAddItems((SelectItemGroup) item, items);
} else {
items.add(item);
}
}
} else if (value instanceof Map) {
for (Map.Entry<Object, Object> entry : ((Map<Object, Object>) value).entrySet()) {
Object label = entry.getKey();
SelectItem item = new SelectItem(entry.getValue(),
label == null ? (String) null : label.toString());
// TODO test - this section is untested
if (item instanceof SelectItemGroup) {
resolveAndAddItems((SelectItemGroup) item, items);
} else {
items.add(item);
}
}
}
}
protected void resolveAndAddItems(SelectItemGroup group, List<SelectItem> items) {
for (SelectItem item : group.getSelectItems()) {
if (item instanceof SelectItemGroup) {
resolveAndAddItems((SelectItemGroup) item, items);
} else {
items.add(item);
}
}
}
}
ERRO:
javax.faces.view.facelets.TagException: /section/operation/processamento.xhtml @32,48 <f:converter> Parent not an instance of ValueHolder: javax.faces.component.UISelectItem@69d4c4b7
at com.sun.faces.facelets.tag.jsf.ConverterTagHandlerDelegateImpl.apply(ConverterTagHandlerDelegateImpl.java:84)
at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:114)
at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:131)
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:162)
at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:114)
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:94)
at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:131)
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:162)
Hm…receio que o seu converter deve ser usado na tag h:selectOneMenu… A proposito, que código monstruoso de converter é esse? :shock:
Mas concordo que o converter nao faria diferença, nao é String que voce está enviando? O JSF já se vira com essa tipagem…algo de errado no seu formulário há.
E os outros campos, estao chegando ao manged-bean?
Esse converter ae seria útil se o ítem selecionado fosse passado como um NUMERO representado como uma String, p.e., “1” ,“2”.
Não conseguí uma adaptação ainda…
Tem um outro campo que não estah chegando, estou vendo o q pode estar acontecendo, se é pq uso um form dentro de outro, etc. Muito estanho, em mensagem anterior desse mesmo post eu mostro o outro campo que não estah chegando.