Possuo o cadastro de Estado, onde o mesmo possui uma tela (estado.xhtml) e um ManagedBean(EstadoBean). Um dos métodos desse MB retorna uma lista de Estados, o qual apresento em um datatable.
Agora, ao fazer o cadastro de Municípios, surgiu a seguinte dúvida:
Eu faria a tela do mesmo, e seu respectivo ManagedBean (MunicipioBean). Porém um dos campos na tela é um selectOneMenu, com todos os estados.
Nesse caso, é correto eu chamar o método que retorna os estados e está no ManagedBean EstadoBean, ou o ideal é eu criar um novo método no MB do Municipio, que me retorne todos os estados?
PS.: Quando digo ‘correto’, refiro-me ao conceito de boas práticas.
Cara, não recomendo!
Imagine vc chamando a tela de inserção/edição de municípios antes de chamar a tela de estados? com certeza o ManagedBean estará null, e consequentemente você terá um nullpointerexception.
Se um SelectOneMenu não depende de informação de outro para ser populado eu mantenho a lista dele em um managedbean só com essa função. dessa forma eu não repito esse método em vários lugares, todas as telas q precisarem de um selectOneMenu buscarão da lista dele.
Isso ainda pode ser aprimorado com o uso de um flyweight para manter um pool de selectItens para todo o sistema.
public abstract class WebUtils(){
private static HashMap<String, List<SelectItem>> selectItemPool;
public static <T extends AbstractEntityDomain> List<SelectItem> getComboBox(Class<T> classe) {
if (!(selectItemPool instanceof HashMap)) {
selectItemPool = new HashMap<String, List<SelectItem>>();
}
if (!selectItemPool.containsKey(classe)) {
List<SelectItem> lista = new ArrayList<SelectItem>();
QueryListResult<T> query = QueryManager.GENERIC.allObejctOrdered(classe).withOrder("descricao");
for (T obj : Repositorio.executeQuery(query)) {
lista.add(new SelectItem(obj, UtilService.invocaMetodo(obj, "getDescricao").toString()));
}
selectItemPool.put(classe.getName(), lista);
}
return selectItemPool.get(classe.getName());
}
public static <T> void refreshComboBox(Class<T> classe) {
if (selectItemPool instanceof HashMap && selectItemPool.containsKey(classe.getName())) {
selectItemPool.remove(classe.getName());
}
}[/code]
[code]@ManagedBean
@SessionScoped
public class ComboBoxController {
public List<SelectItem> getListaEscolaridade() {
return WebUtils.getComboBox(Escolaridade.class);
}
public List<SelectItem> getListaEstadoCivil() {
return WebUtils.getComboBox(Estadocivil.class);
}
public List<SelectItem> getListaSituacaoJuridica() {
return WebUtils.getComboBox(Situacaojuridica.class);
}
public List<SelectItem> getListaSituacaoOperacional() {
return WebUtils.getComboBox(Situacaooperacional.class);
}
public List<SelectItem> getListaCondicoesMoradia() {
return WebUtils.getComboBox(Condicoesmoradia.class);
}
public List<SelectItem> getListaTipoTelefone() {
return WebUtils.getComboBox(Tipotelefone.class);
}
public List<SelectItem> getListaTipoParentesco() {
return WebUtils.getComboBox(Tipoparentesco.class);
}