Bom dia,
tenho duas tabelas com relacionamento, seleciono atraves de um selectonemenu.Sem a opção converter seleciono os indices dos valores corretos, quando ligo invoco a classe converter os os valores dos indices fica -1.
Classe Converter
@FacesConverter(value = "objectConverter")
public class ObjectConverter implements Converter {
private int index = -1;
/*
* (non-Javadoc)
*
* @see
* javax.faces.convert.Converter#getAsObject(javax.faces.context.FacesContext,
* javax.faces.component.UIComponent, java.lang.String)
*/
@Override
public Object getAsObject(FacesContext context, UIComponent component,
String value) throws ConverterException {
Object result = null;
if (StringUtils.isNotBlank(value)) {
Object selectedItem = this.getSelectedItemByIndex(component,
Integer.parseInt(value));
result = selectedItem;
if (selectedItem != null) {
if (selectedItem instanceof SelectItem) {
result = ((SelectItem) selectedItem).getValue();
}
}
}
return result;
}
/*
* (non-Javadoc)
*
* @see
* javax.faces.convert.Converter#getAsString(javax.faces.context.FacesContext,
* javax.faces.component.UIComponent, java.lang.Object)
*/
@Override
public String getAsString(FacesContext context, UIComponent component,
Object value) throws ConverterException {
List<Object> items = this.getSelectItems(component);
int index = items.indexOf(value);
return String.valueOf(index);
}
/**
* Obtem o SelecItem de acordo com a opção selecionada pelo usuário
*/
protected Object getSelectedItemByIndex(UIComponent component, int index) {
List<Object> items = this.getSelectItems(component);
int size = items.size();
if (index > -1 && size > index) {
return items.get(index);
}
return null;
}
protected List<Object> getSelectItems(UIComponent component) {
List<Object> items = new ArrayList<Object>();
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<Object> 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<Object> items) {
boolean isRendered = uiItems.isRendered();
if (!isRendered) {
items.add(null);
return;
}
Object value = uiItems.getValue();
if (value instanceof SelectItem) {
items.add(value);
} else if (value instanceof Object[]) {
Object[] array = (Object[]) value;
for (int i = 0; i < array.length; i++) {
if (array[i] instanceof SelectItemGroup) {
this.resolveAndAddItems((SelectItemGroup) array[i], items);
} else {
items.add(array[i]);
}
}
} else if (value instanceof Collection) {
Iterator<Object> iter = ((Collection<Object>) value).iterator();
Object item;
while (iter.hasNext()) {
item = iter.next();
if (item instanceof SelectItemGroup) {
this.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());
if (item instanceof SelectItemGroup) {
this.resolveAndAddItems((SelectItemGroup) item, items);
} else {
items.add(item);
}
}
}
}
protected void resolveAndAddItems(SelectItemGroup group, List<Object> items) {
for (SelectItem item : group.getSelectItems()) {
if (item instanceof SelectItemGroup) {
this.resolveAndAddItems((SelectItemGroup) item, items);
} else {
items.add(item);
}
}
}
}
Pagina xhtml
<h:form prependId="false" id="cadastroUsuario">
<p:panel header="Cadastro de Usuários" style="width: 500px;margin-left: 24%;">
<h:panelGrid columns="2" cellpadding="5">
<h:outputText value="Nome: "/>
<h:inputText id="nome" value="#{UsuarioBean.usuario.nome}" size="40" maxlength="50" autocomplete="off" required="true" requiredMessage="Campo Nome é Obrigatório"/>
<h:outputText value="Bairro:" />
<h:selectOneMenu id="sele1" onclick="mensage()" value="#{UsuarioBean.usuario.bairro}" converter="objectConverter" required="true" requiredMessage="Campo Bairro Obrigatorio">
<f:selectItems value="#{BairroBean.bairros}" var="lisBairro" itemLabel="#{lisBairro.nome}" itemValue="#{lisBairro.id}"/>
</h:selectOneMenu>
<p:commandButton immediate="true" ajax="false" value="Voltar" action="voltar" style="background: #999999; color: #ffffff; " icon="ui-icon-back" />
<p:commandButton ajax="false" value="Cadastrar" update="cadastroUsuario" actionListener="#{UsuarioBean.cadastrar()}" style="background: #999999; color: #ffffff; " icon="ui-icon-disk" />
</h:panelGrid>
</p:panel>
</h:form>