I'm running an application with jsf 2.2.5 .
I used the h:dataTable
component to display an object collection on the screen. I added to this component two h:commandLink
, one that must perform one edit method and one remove method to interact with its object in each iteration of the collection.
If you pass to the component h:dataTable
a TreeMap<>
that is retrieved through a managed bean , of a static attribute of a certain class, it works normally. However, when I filter this collection and return a List<>
with some of the objects in the collection (this is assigned to a managed bean attribute before being sent to the view ) the two h:commandLink
stop working, the methods to which they are associated do not even run.
Follow the view's code:
...
<h:form acceptcharset="ISO-8859-1" id="lista" styleClass="col-xs-12 box" rendered="#{gerenciarLivro.resultadoDaPesquisa.size() > 0}">
<h:dataTable value="#{gerenciarLivro.resultadoDaPesquisa}" var="livro" >
<h:column >
<fieldset >
<div class="col-xs-10 col-sm-10 col-md-11 pull-left">
<div class="col-xs-12 col-sm-12">
<label>
<strong>#{livro.titulo}</strong>
</label>
</div>
<div class="col-xs-6 col-sm-6">
<label class="text-info" >#{livro.autor}</label>
</div>
<div class="col-xs-6 col-sm-6">
<label>#{livro.editora}</label>
</div>
<div class="col-xs-6 col-sm-3">
<label>#{livro.genero}</label>
</div>
<div class="col-xs-6 col-sm-3">
<label>#{livro.ISBN}</label>
</div>
<div class="col-xs-6 col-sm-3">
<label>#{livro.ano}</label>
</div>
<div class="col-xs-6 col-sm-3">
<label>#{livro.edicao}</label>
</div>
</div>
<div class="col-xs-2 col-sm-2 col-md-1 pull-right">
<div class="plus">
<i class="glyphicon glyphicon-plus"> </i>
</div>
</div>
<div class="col-xs-12 sub hide">
<div class="form-group col-xs-4">
<h:commandLink styleClass="btn btn-xs btn-inverse col-xs-12" action="#{gerenciarLivro.removerLivro(livro)}">
<f:ajax />
<i class="glyphicon glyphicon-trash pull-left"> </i> Remover
</h:commandLink>
</div>
<div class="form-group col-xs-4">
<h:commandLink styleClass="btn btn-xs btn-primary col-xs-12" action="#{gerenciarLivro.editarLivro()}">
<f:ajax />
<i class="glyphicon glyphicon-edit pull-left"> </i> Editar
</h:commandLink>
</div>
<div class="form-group col-xs-4">
<button class="btn btn-xs btn-primary col-xs-12" >
<i class="glyphicon glyphicon-book pull-left"></i> Fila de espera
</button>
</div>
</div>
</fieldset>
</h:column>
</h:dataTable>
</h:form>
...
Following the Managed bean code:
...
@Named(value = "gerenciarLivro")
@RequestScoped
public class GerenciarLivroMB implements Serializable {
private String ISBN;
private String titulo;
private String autor;
private String editora;
private String genero;
private String ano;
private String edicao;
@Inject
private ControleDeLivro controle;
private List<Livro> resultadoDaPesquisa;
public void adicionarLivro() {
controle.adicionar(construirLivro());
limparDados();
}
public String removerLivro(Livro l) {
controle.remover(l);
resultadoDaPesquisa.remove(l);
return ("removerLivro");
}
public String editarLivro(Livro l) {
return ("editarLivro");
}
public Collection<Livro> getLivros() {
return Repositorio.livros();
}
public Collection<Livro> getResultadoDaPesquisa() {
return resultadoDaPesquisa;
}
public void pesquisarLivro() {
if (resultadoDaPesquisa != null) {
resultadoDaPesquisa.clear();
}
resultadoDaPesquisa = controle.pesquisar(construirLivro());
limparDados();
}
private void limparDados() {
ISBN = "";
titulo = "";
autor = "";
editora = "";
genero = "";
ano = "";
edicao = "";
}
private Livro construirLivro() {
Livro l = new Livro();
if (ISBN != null && !ISBN.isEmpty()) {
l.setISBN(ISBN);
}
if (titulo != null && !titulo.isEmpty()) {
l.setTitulo(titulo);
}
if (autor != null && !autor.isEmpty()) {
l.setAutor(autor);
}
if (editora != null && !editora.isEmpty()) {
l.setEditora(editora);
}
if (genero != null && !genero.isEmpty()) {
l.setGenero(genero);
}
if (ano != null && !ano.isEmpty()) {
l.setAno(ano);
}
if (edicao != null && !edicao.isEmpty()) {
l.setEdicao(edicao);
}
return l;
}
...
outros getters e setters.
When I use the collection coming from this class everything works perfectly:
public class Repositorio {
private static TreeSet<Livro> livros;
private static List<Emprestimo> emprestimo;
private static Deque<Emprestimo> devolucao;
public static TreeSet<Livro> livros() {
if (livros == null) {
livros = new TreeSet<>();
}
return livros;
}
public static List<Emprestimo> emprestimo() {
if (emprestimo == null) {
emprestimo = new ArrayList<>();
}
return emprestimo;
}
public static Deque<Emprestimo> devolucao() {
if (devolucao == null) {
devolucao = new ArrayDeque<>();
}
return devolucao;
}
}