Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Problemas com o passThroughAttribute

No cadastro de autor já com o atributo email, o valor deste não é inserido no banco. Nos meus testes (no método gravar do AutorBean) imprimo o atributo email de autor e ele retorna null. Fiz tudo conforme na explicação... inserir o <f: passThroughAttribute dentro do inputText, criei a proriedade (com get e set) e nada. O banco foi atualizado com o campo email, mas o valor não é inserido.

5 respostas
solução!

Leonardo, você pode postar seu AutorBean e a página?

package br.com.caelum.livraria.bean;

import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import br.com.caelum.livraria.dao.DAO;
import br.com.caelum.livraria.modelo.Autor;
import br.com.caelum.livraria.util.RedirectView;

@ManagedBean
@ViewScoped
public class AutorBean {

    private Autor autor = new Autor();

    private Integer autorId;

    public Autor getAutor() {
        return autor;
    }

    public RedirectView gravar() {
        System.out.println("Gravando autor " + this.autor.getNome()+" e email: "+this.autor.getEmail());

        if(this.autor.getId()==null)
            new DAO<Autor>(Autor.class).adiciona(this.autor);
        else 
            new DAO<Autor>(Autor.class).atualiza(this.autor);

        return new RedirectView("livro");
    }

    public List<Autor> getAutores() {

        return new DAO<Autor>(Autor.class).listaTodos();
    }

    public Integer getAutorId() {
        return autorId;
    }

    public void setAutorId(Integer autorId) {
        this.autorId = autorId;
    }

    public void carregarAutorPelaId() {
        this.autor = new DAO<Autor>(Autor.class).buscaPorId(autorId);
    }

    public void carregarAutor(Autor autor) {
        this.autor = autor;
    }

    public void excluir(Autor autor) {
        new DAO<Autor>(Autor.class).remove(autor);
    }


}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets">

<h:head/>

<f:metadata>
    <f:viewParam name="autorId" value="#{autorBean.autorId}"/>
    <f:viewAction action="#{autorBean.carregarAutorPelaId}" if="#{autorBean.autorId !=null}"/>
</f:metadata>

<ui:composition template="_template.xhtml">
    <ui:define name="titulo">
        Novo Autor
    </ui:define>

    <ui:define name="conteudo">

        <h:form id="autor">
            <fieldset>
                <legend>Dados do Autor</legend>

                <h:panelGrid columns="3">

                    <h:outputLabel value="Nome:" for="nome" />
                    <h:inputText id="nome" value="#{autorBean.autor.nome}" />

                    <h:message for="nome" id="messageNome" />

                    <h:outputLabel value="Email:" for="email" />
                    <h:inputText id="email" value="#{autorBean.autor.email}"
                        required="true">
                        <f:passThroughAttribute name="type" value="email" />
                    </h:inputText>

                    <h:message for="email" id="messageEmail" />

                    <h:commandButton value="Gravar" action="#{autorBean.gravar}" >
                        <f:ajax execute="nome" render="@form :formListaAutores:listaAutores"/>
                    </h:commandButton>

                </h:panelGrid>

            </fieldset>
        </h:form>

        <h:form id="formListaAutores">

            <h:dataTable value="#{autorBean.autores}" var="autor" id="listaAutores">
                <h:column>
                    <f:facet name="header">Nome: </f:facet>
                    <h:outputText value="#{autor.nome}"/>
                </h:column>
                <h:column>
                    <f:facet name="header">Alterar:</f:facet>
                    <h:commandLink value="Alterar" action="#{autorBean.carregarAutor(autor)}"/>
                </h:column>
                <h:column>
                    <f:facet name="header">Excluir:</f:facet>
                    <h:commandLink value="Excluir" action="#{autorBean.excluir(autor)}" />
                </h:column>
            </h:dataTable>

        </h:form>

    </ui:define>

    <ui:define name="rodape">
        Copyright Caelum 2017 - Página Cadastro de Autor
    </ui:define>

</ui:composition>

</html>

Desculpe, Manoel. Acabei fazendo cagada clicando como solucionado, mas ainda não está. Coloquei acima os códigos solicitados.

Obrigado!

Fala, Leonardo! Sem problemas! Ele será resolvido... hehe.

Adiciona o método setAutor() no teu bean. Assim:

public void setAutor(Autor autor) {
        this.autor = autor;
}

Troca, também, o import do @ViewScoped. De:

import javax.faces.bean.ViewScoped;

Para:

import javax.faces.view.ViewScoped;

Faz os testes e dá um retorno.

Abraço.