Olá amigos!
Estou precisando da ajuda de vcs com um projeto onde preciso selecionar em uma lista o artista e mostrar em outra os albuns associados a este artista.
Nesta tela que citei, estou tentando utilizar o componente orderingList. Coloquei 2 orderingList, um para os artistas e outro para os álbuns.
O PROBLEMA: Quando eu clico no artista, a chamada ao metodo ocorre na primeira vez sem problemas. A segunda vez, passa pela classe Converter e ai o metodo nao é chamado. Percebi o seguinte: quando a primeira vez, encontra o album ou albuns para o artista, o metodo popula na boa a lista de albuns mas dai é que começa a ocorrer o que citei. Dá a impressão que o converter pega sempre o valor que está na lista de álbuns e “não deixa” o método filtrarAlbuns ser chamado.
Já tentei mudar para o componente mais simples do JSF (selectmanylistbox) mas não vingou. Vou postar os codigos aqui para vcs me darem uma força
paginaPrincipal.xhtml
Esta dentro de um a4:form e paineis (so postei as colunas com os 2 orderingLists)
<h:column id="coluna1">
<rich:orderingList id="listaArtistas" value="#{principalBean.artistas}"
selection="#{principalBean.artistasSelecionados}"
var="artista" listHeight="370" listWidth="165"
converter="artistaConverter" fastOrderControlsVisible="false" orderControlsVisible="false" >
<rich:column width="180">
<f:facet name="header">
<h:outputText id="tituloArtistas" value="Artistas" style="font-weight:bold;"/>
</f:facet>
<h:outputText id="nomeArtista" value="#{artista.nomeArtista}"></h:outputText>
</rich:column>
<a4j:support id="sup1" event="onclick"
action="#{principalBean.filtrarAlbuns}" reRender="listaAlbuns" />
<a4j:support id="sup345" event="onkeyup"
action="#{principalBean.filtrarAlbuns}" reRender="listaAlbuns" />
</rich:orderingList>
</h:column>
<h:column id="coluna2">
<rich:orderingList id="listaAlbuns" value="#{principalBean.albuns}"
selection="#{principalBean.albunsSelecionados}"
var="album" listHeight="370" listWidth="165"
converter="albumConverter" fastOrderControlsVisible="false" orderControlsVisible="false" >
<rich:column width="180">
<f:facet name="header">
<h:outputText id="tituloAlbuns" value="Álbuns" style="font-weight:bold;"/>
</f:facet>
<h:inputHidden id="idAlbum" value="#{album.idAlbum}"></h:inputHidden>
<h:outputText id="nomeArtista" value="#{album.nomeAlbum}"></h:outputText>
</rich:column>
</rich:orderingList>
</h:column>
PrincipalBean.java
package managedbean;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import model.Album;
import model.Artista;
import model.Musica;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import retorno.RetornoAlbum;
import retorno.RetornoArtista;
import controller.GerenteAlbum;
import controller.GerenteArtista;
public class PrincipalBean implements Serializable {
private static final long serialVersionUID = 8914596525261452207L;
private Album album = new Album();
private Artista artista = new Artista();
private Musica musica = new Musica();
private List<Album> albuns = new ArrayList<Album>();
private List<Artista> artistas = new ArrayList<Artista>();
private List<Musica> musicas = new ArrayList<Musica>();
private Set<Artista> artistasSelecionados;
private Set<Album> albunsSelecionados;
private Set<Album> albunsColecaoSelecionados;
public PrincipalBean() {
}
// Carrega lista de albuns de acordo com artista selecionado
public void filtrarAlbuns() {
if(artistasSelecionados.size() > 0){
for (Iterator<Artista> it = artistasSelecionados.iterator(); it.hasNext();) {
Artista artista = it.next();
RetornoAlbum tResult;
tResult = GerenteAlbum.selectListaAlbunsByNomeArtista(artista.getNomeArtista());
if(tResult.isOk())
this.albuns = tResult.getListaAlbuns();
else{
this.albuns = new ArrayList<Album>();
// Cria uma nova mensagem de informação para o JSF
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_WARN, tResult.getMensagem(), tResult.getMensagem());
// Adiciona a mensagem ao formulário (que consta declarado no template)
FacesContext.getCurrentInstance().addMessage(null, message);
}
}
}else {
String mensagemAviso = "Selecione apenas um artista para visualizar a lista de álbuns";
// Cria uma nova mensagem de informação para o JSF
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_WARN, mensagemAviso, mensagemAviso);
// Adiciona a mensagem ao formulário (que consta declarado no template)
FacesContext.getCurrentInstance().addMessage(null, message);
}
}
/** Getters and Setters **/
public Album getAlbum() {
return album;
}
public void setAlbum(Album album) {
this.album = album;
}
public Artista getArtista() {
return artista;
}
public void setArtista(Artista artista) {
this.artista = artista;
}
public Musica getMusica() {
return musica;
}
public void setMusica(Musica musica) {
this.musica = musica;
}
public List<Album> getAlbuns() {
return albuns;
}
public void setAlbuns(List<Album> albuns) {
this.albuns = albuns;
}
public List<Artista> getArtistas() {
RetornoArtista tResult;
tResult = GerenteArtista.selectAll();
return tResult.getListaArtistas();
}
public void setArtistas(List<Artista> artistas) {
this.artistas = artistas;
}
public List<Musica> getMusicas() {
return musicas;
}
public void setMusicas(List<Musica> musicas) {
this.musicas = musicas;
}
public Set<Artista> getArtistasSelecionados() {
return artistasSelecionados;
}
public void setArtistasSelecionados(Set<Artista> artistasSelecionados) {
this.artistasSelecionados = artistasSelecionados;
}
public Set<Album> getAlbunsSelecionados() {
return albunsSelecionados;
}
public void setAlbunsSelecionados(Set<Album> albunsSelecionados) {
this.albunsSelecionados = albunsSelecionados;
}
public Set<Album> getAlbunsColecaoSelecionados() {
return albunsColecaoSelecionados;
}
public void setAlbunsColecaoSelecionados(Set<Album> albunsColecaoSelecionados) {
this.albunsColecaoSelecionados = albunsColecaoSelecionados;
}
}
AlbumConverter
package converter;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import model.Album;
public class AlbumConverter implements Converter {
public AlbumConverter() {
}
public Object getAsObject(FacesContext facesContext, UIComponent component, String infoAlbum) {
//Convertendo String para Object Album
String[] words = infoAlbum.split(":");
String idAlbum = words[0];
String nomeAlbum = words[1];
return new Album(Integer.valueOf(idAlbum), nomeAlbum);
}
public String getAsString(FacesContext facesContext, UIComponent uIComponent, Object object) {
//Convertendo Object Album para String
return object.toString();
}
}
Album.java
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package model;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
public class Album implements Serializable{
private static final long serialVersionUID = -3569156520961540220L;
private Integer idAlbum;
private String nomeAlbum;
private Integer anoLancamento;
private byte[] fotoImagem;
private List<Artista> listaArtistas = new ArrayList<Artista>();
public Album() {
}
// Mostrar album na lista
public Album(Integer idAlbum, String nomeAlbum) {
this.idAlbum = idAlbum;
this.nomeAlbum = nomeAlbum;
}
// Update
public Album(Integer idAlbum, String nomeAlbum, Integer anoLancamento, byte[] fotoImagem) {
this.idAlbum = idAlbum;
this.nomeAlbum = nomeAlbum;
this.anoLancamento = anoLancamento;
this.fotoImagem = fotoImagem;
}
// Insert
public Album(String nomeAlbum, Integer anoLancamento, byte[] fotoImagem) {
this.nomeAlbum = nomeAlbum;
this.anoLancamento = anoLancamento;
this.fotoImagem = fotoImagem;
}
// Delete
public Album(Integer idAlbum) {
this.idAlbum = idAlbum;
}
// Select By Name
public Album(String nomeAlbum) {
this.nomeAlbum = nomeAlbum;
}
/**
* @return the idAlbum
*/
public Integer getIdAlbum() {
return idAlbum;
}
/**
* @param idAlbum the idAlbum to set
*/
public void setIdAlbum(Integer idAlbum) {
if (idAlbum <= 0) {
throw new IllegalArgumentException("Número zerado ou negativo");
}
this.idAlbum = idAlbum;
}
/**
* @return the nomeAlbum
*/
public String getNomeAlbum() {
return nomeAlbum;
}
/**
* @param nomeAlbum the nomeAlbum to set
*/
public void setNomeAlbum(String nomeAlbum) {
if (nomeAlbum == null || nomeAlbum.equalsIgnoreCase("")) {
throw new IllegalArgumentException("Nome do album com valor nulo ou vazio");
}
this.nomeAlbum = nomeAlbum;
}
/**
* @return the anoLancamento
*/
public Integer getAnoLancamento() {
return anoLancamento;
}
/**
* @param anoLancamento the anoLancamento to set
*/
public void setAnoLancamento(Integer anoLancamento) {
this.anoLancamento = anoLancamento;
}
/**
* @return the listaArtistas
*/
public List<Artista> getListaArtistas() {
return listaArtistas;
}
/**
* @param listaArtistas the listaArtistas to set
*/
public void setListaArtistas(List<Artista> listaArtistas) {
this.listaArtistas = listaArtistas;
}
/**
* @return the fotoImagem
*/
public byte[] getFotoImagem() {
return fotoImagem;
}
/**
* @param fotoImagem the fotoImagem to set
*/
public void setFotoImagem(byte[] fotoImagem) {
this.fotoImagem = fotoImagem;
}
// Para mostrar na lista de musicas e tambem na comboBox (CadMusica)
public String toString() {
return idAlbum + ":" + nomeAlbum;
}
@Override
public boolean equals(Object obj) {
if (obj == null)
return false;
if (!(obj instanceof Album))
return false;
if (getIdAlbum() == null)
return false;
final Album other = (Album) obj;
return getIdAlbum().equals(other.getIdAlbum());
}
@Override
public int hashCode() {
return this.idAlbum;
}
}