NullPointer no atributo que recebe do selectOneMenu

2 respostas
T

Olá pessoal,
tenho o seguinte form…

<h:form>
          <h:panelGrid columns="2">
            <h:outputLabel value="Nome:" for="nome"/>
            <h:inputText id="nome" value="#{produtoDAO.produto.nome}" required="true" requiredMessage="DIGITE"/>
                        
            <h:outputLabel value="Descrição:" for="desc"/>
            <h:inputTextarea id="desc" value="#{produtoDAO.produto.descricao}"/>

            <h:outputLabel value="Preço:" for="preco"/>
            <h:inputText id="preco" value="#{produtoDAO.produto.preco}"/>

            <h:selectOneMenu value="#{produtoDAO.produto.secao}" >
                <f:selectItems value="#{secaoDAO.secoes}" var="sec" itemValue="#{sec}" itemLabel="#{sec.nome}"/>
                <f:converter converterId="SecaoConverter"/>
            </h:selectOneMenu>

            <h:commandButton action="#{produtoDAO.inserir}" value="add"/>
          </h:panelGrid>
        </h:form>

…porém quando o método produtoDAO.inserir é chamado o atributo secao (de produto) está nulo; os demais atributos do form estão OK. Imaginei que fosse algo no converter, o código dele segue abaixo… coloquei uns prints para ver se ele estava sendo invocado e deu ok (o objeto sec não estava nulo)…

@FacesConverter(forClass=Secao.class,value="SecaoConverter")
public class SecaoConverter implements Converter{

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        try{
            String[] str = value.split("#");
            SecaoDAO controller = (SecaoDAO) context.getApplication().getELResolver().getValue(context.getELContext(), null, "secaoDAO");
            int id = Integer.parseInt(str[0]);
            Secao sec = controller.procurar(id);
            System.out.println("Converter - getAsObject [ok]:");
            System.out.println(">> "+sec.getId()+"  - "+sec.getNome());
            return sec;
        }catch(Exception ex){
            ex.printStackTrace();
        }finally{
            return null;
        }
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        System.out.println("Converter - getAsString [ok]:");
        Secao sec = (Secao)value;
        String output = sec.getId()+"#"+sec.getNome();
        return output;
    }
}

Bom, coloquei o get e set para Secao na classe Produto… enfim não sei o que está faltando e porque o objeto secao não está sendo passado do form para o bean.
Fico no aguardo da ajuda de vocês
flw

2 Respostas

T

Um erro que verifiquei eh que não estava passando um array de SelectItem para popular o combobox… (eu tava mandando a lista de Secao) implementei essa conversão
porém apareceu outro erro…

No método getAsString do converter deu erro no casting (linha 24), diz que não pode fazer casting de String para Secao… bom o método que retorna o array de SelectItem:

public static SelectItem[] getSelectItems(List<?> entities, boolean selectOne) {
        int size = selectOne ? entities.size() + 1 : entities.size();
        SelectItem[] items = new SelectItem[size];
        int i = 0;
        if (selectOne) {
            items[0] = new SelectItem("", "---");
            i++;
        }
        for (Object x : entities) {
            items[i++] = new SelectItem(x);
        }
        return items;
    }

no secaoDAO:

public SelectItem[] getSecoesItems() {
            if(this.secoes != null){
                return JsfUtil.getSelectItems(this.secoes, true);
            }else{
                return JsfUtil.getSelectItems(this.getSecoes(), true);
            }

        }

e no form ficou

<h:selectOneMenu id="secao" value="#{produtoDAO.produto.secao}" immediate="true">
                <f:selectItems value="#{secaoDAO.secoesItems}"/>
                <f:converter converterId="SecaoConverter"/>
            </h:selectOneMenu>

Bom não sei porque esta chegando uma String e não uma Secao… sou novo com JSF (eh minha primeira aplicação) e estou meio enrolado.

Tenho estudado pela apostila da K19 e pelos tutoriais do coreservlets (http://www.coreservlets.com/JSF-Tutorial/jsf2/)… há outras fontes livres pra aprender JSF ??

fico no aguardo de alguma ajuda
flw

T

Achei o problema do casting… linha 06 do função que retorna SelectItem … porém não funcionou voltou o problema anterior: o objeto Secao não está sendo settado no atributo secao de produto… coloquei um print em produtoDAO.inserir >>>

public String inserir() throws Exception{
		Transaction t = session.beginTransaction();
                System.out.println("## INSERIR");
                System.out.print("## "+produto.getNome()+"  "+produto.getPreco());
                System.out.println("  "+produto.getSecao().getNome());//<<<<<<< AQUI DAH NULL POINTER
		this.session.save(produto);
		t.commit();
                this.produto = null;
                return "list";
	}
Criado 8 de abril de 2012
Ultima resposta 8 de abr. de 2012
Respostas 2
Participantes 1