1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Erro de validação: o valor não é válido

Bom dia pessoal, lá vai mais uma dúvida!

Pesquisei bastante sobre este erro, porém não encontrei a solução para o meu caso.

Eu estou passando pelo erro "Erro de validação: o valor não é válido" ao tentar submeter o formulário de cadastro de produtos. O erro ocorre no campo somTipoProduto.

<p:selectOneMenu id="somTipoProduto" value="#{produtoFace.selected.tipoProduto}" 
                 onchange="javascript:habilitaQuantidadeQuandoIgualCredito();" 
                 converter="entityConverter" required="true" 
                 requiredMessage="Selecione um tipo de produto">
    <f:selectItem/>
    <f:selectItems  value="#{produtoFace.listTipoProduto}" var="tipoProd" 
                    itemLabel="#{tipoProd.nome}" itemValue="#{tipoProd}"/>                    
</p:selectOneMenu>

O problema não parece ser no converter já debugei ele todo e não ocorreu nenhum erro. O converter que eu utilizei pode ser encontrado neste link: http://www.guj.com.br/33361-listener-do-selectonemenu-nao-funciona

Agora, a única validação que eu estou utilizando é a "required=true", eu já testei ela e está funcionando ok.

Os métodos equals e hasCode também estão implementados na minha entidade JPA.

Agora fica a dúvida: O que está causando este erro "Erro de validação: o valor não é válido"?

Se houver necessidade, me peçam que eu coloco o código do meu bean.

Obrigado.

EDIT

O converter que estou utilizando:

@FacesConverter(value="entityConverter")
public class EntityConverter implements Converter {

    public Object getAsObject(FacesContext ctx, UIComponent component,String value) {
        if (value != null) {
            return component.getAttributes().get(value);
        }
        return null;
    }

    public String getAsString(FacesContext ctx, UIComponent component,    Object obj) {
        if (obj != null && !"".equals(obj)) {
            String id;
            try {
                id = this.getId(getClazz(ctx, component), obj);
                if (id == null) {
                    id = "";
                }
                id = id.trim();
                component.getAttributes().put(id, getClazz(ctx, component).cast(obj));
                return id;
            } catch (SecurityException e) {
                e.printStackTrace(); // TODO: gerar log
            } catch (IllegalArgumentException e) {
                e.printStackTrace(); // TODO: gerar log
            } catch (NoSuchFieldException e) {
                e.printStackTrace(); // TODO: gerar log
            } catch (IllegalAccessException e) {
                e.printStackTrace(); // TODO: gerar log
            }
        }
        return null;
    }

    /**
     * Obtém, via expression language, a classe do objeto.
     *
     * @param facesContext
     * 
     * @param component
     *     
     * @return  Class<?>
     */
    private Class<?> getClazz(FacesContext facesContext, UIComponent component) {
        return component.getValueExpression("value").getType(facesContext.getELContext());
    }


    /**
     * Retorna a representação em String do retorno do método anotado com @Id ou @EmbeddedId do objeto.
     *
     * @param clazz
     *            
     * @return String id
     */
    public String getId(Class<?> clazz, Object obj) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {

        List<Class<?>> hierarquiaDeClasses = this.getHierarquiaDeClasses(clazz);

        for (Class<?> classeDaHierarquia : hierarquiaDeClasses) {
            for (Field field : classeDaHierarquia.getDeclaredFields()) {
                if ((field.getAnnotation(Id.class)) != null    || field.getAnnotation(EmbeddedId.class) != null) {
                    Field privateField = classeDaHierarquia.getDeclaredField(field.getName());
                    privateField.setAccessible(true);
                    if (privateField.get(clazz.cast(obj)) != null) {
                        return (String) field.getType().cast(privateField.get(clazz.cast(obj))).toString();
                    }
                }
            }
        }
        return null;
    }

    /**
     * Retorna uma lista com a hierarquia de classes, sem considerar a classe Object.class
     *
     * @param Class<?> clazz
     *            
     * @return  List<Class<?>> clazz
     */
    public List<Class<?>> getHierarquiaDeClasses(Class<?> clazz) {

        List<Class<?>> hierarquiaDeClasses = new ArrayList<Class<?>>();
        Class<?> classeNaHierarquia = clazz;
        while(classeNaHierarquia != Object.class) {
            hierarquiaDeClasses.add(classeNaHierarquia);
            classeNaHierarquia = classeNaHierarquia.getSuperclass();

        }
        return hierarquiaDeClasses;
    } 
}
  • o nome do seu converter é entityConverter ou tipoProdutoConverter?

    Jfestrela Cestrela   08 de dez de 2014
  • O converter que estou utilizando é o entityConverter que o Finnoti colocou como resposta na outra questão. Vou incluir o código aqui pra não gerar confusão

    petros   08 de dez de 2014
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags java jsf primefaces ou faça a sua própria pergunta.