O atributo sortBy pelo titulo e ISBN não funcionou, mesmo fazendo o cacheamento como informado no exercício. Não sei o que estou fazendo errado
@ManagedBean
@ViewScoped
public class LivroBean implements Serializable {
private static final long serialVersionUID = 1L;
private Livro livro = new Livro();
private Integer autorId;
private Integer livroId;
private List<Livro> livros;
public void carregarLivroPeloId() {
this.livro = new DAO<Livro>(Livro.class).buscaPorId(livroId);
}
public List<Autor> getAutores() {
return new DAO<Autor>(Autor.class).listaTodos();
}
public List<Livro> getLivros() {
DAO<Livro> dao = new DAO<Livro>(Livro.class);
if(this.livros == null) {
this.livros = dao.listaTodos();
}
return livros;
}
public List<Autor> getAutoresDoLivro() {
return this.livro.getAutores();
}
public void gravar() {
System.out.println("Gravando livro " + this.livro.getTitulo());
if (livro.getAutores().isEmpty()) {
// throw new RuntimeException("Livro deve ter pelo menos um Autor.");
FacesContext.getCurrentInstance().addMessage("autor",
new FacesMessage("Livro deve ter pelo menos um Autor."));// pegando a exception e jogando como
// mensagem na tela
return;
}
// IF para incluir se for um livro novo ou atualizar os dados de um livro
DAO<Livro> dao = new DAO<Livro>(Livro.class);
if (this.livro.getId() == null) {
dao.adiciona(this.livro);
this.livros = dao.listaTodos();
} else {
dao.atualiza(livro);
}
this.livro = new Livro();
}
// carregando livro nos textbox para alteração
public void carregar(Livro livro) {
System.out.println("Carregando livro: '" + livro.getTitulo() + "' para alteracao");
this.livro = livro;
}
// metodo para remover o livro
public void remover(Livro livro) {
System.out.println("Removendo livro: " + livro.getTitulo());
new DAO<Livro>(Livro.class).remove(livro);
}
public void gravarAutor() {
Autor autor = new DAO<Autor>(Autor.class).buscaPorId(this.autorId);
this.livro.adicionaAutor(autor);
}
// Removendo autor do livro e usando o metodo na classe Livro.
public void removerAutorDoLivro(Autor autor) {
this.livro.removeAutor(autor);
}
// Tratamento de validação manual do xhtml
public void comecaComDigitoUm(FacesContext fc, UIComponent component, Object value) throws ValidatorException {
String valor = value.toString();
if (!valor.startsWith("1")) {
throw new ValidatorException(new FacesMessage("ISBN Deveria começar com 1"));
}
}
public Integer getLivroId() {
return livroId;
}
public void setLivroId(Integer livroId) {
this.livroId = livroId;
}
public Integer getAutorId() {
return autorId;
}
public void setAutorId(Integer autorId) {
this.autorId = autorId;
}
public Livro getLivro() {
return livro;
}
public void setLivro(Livro livro) {
this.livro = livro;
}
public void setLivros(List<Livro> livros) {
this.livros = livros;
}
}
.
<h:form id="tabelaDeLivros">
<br />
<p:dataTable id="tabelaLivros" value="#{livroBean.livros}"
var="livro">
<!--o atributo headerText subtitui o f:facet -->
<f:facet name="header">Livros</f:facet>
<p:column headerText="titulo" sortBy="#{livro.titulo}">
<h:outputText value="#{livro.titulo}" />
</p:column>
<p:column headerText="ISBN" sortBy="#{livro.isbn}">
<h:outputText value="#{livro.isbn}" />
</p:column>
<p:column>
<f:facet name="header">Preço</f:facet>
<h:outputText value="#{livro.preco}">
<f:convertNumber type="currenty" pattern="R$ 0.00"
currencySymbol="R$" locale="pt_BR" />
</h:outputText>
</p:column>
<p:column>
<f:facet name="header">Data</f:facet>
<h:outputText value="#{livro.dataLancamento.time}">
<f:convertDateTime pattern="dd/MM/yyy HH:mm" />
<!-- timeZone="America/Sao_Paulo" -->
</h:outputText>
</p:column>
<!--CARREGANDO DADOS PARA O TEXT BOX E PERMITE ALTERAÇÂO -->
<p:column>
<f:facet name="header">Alterar</f:facet>
<h:commandLink value="Alterar">
<f:setPropertyActionListener target="#{livroBean.livro}" value="#{livro}" /> <!-- esta tag -->
</h:commandLink>
</p:column>
<!--EFETUA REMOÇÃO DO LIVRO -->
<p:column >
<f:facet name="header">Remover</f:facet>
<h:commandLink value="remove" action="#{livroBean.remover(livro)}"></h:commandLink>
</p:column>
</p:dataTable>