Antes de escrever a segunda parte do artigo, vou apresentar o código do managed bean mencionado na seção de comentários do post anterior.
Na ocasião, o leitor Alessandro questionou os motivos de passar para os métodos create() e update() dos services um Map<String, Object> contendo os dados a serem persistidos ao invés da própria entidade. Respondi então que um desses motivos era a existência de um managed bean cujos atributos mapeados para a página JSF correspondente estavam contidos em um Map<String, Object> – onde a key é o nome do atributo e o value, seu valor – e assim seria mais fácil passá-lo para os services.
Sem mais delongas, segue o código (comentários javadoc removidos para torná-lo mais sucinto).
public abstract class ControllerBean {
private Map<String, Object> parametros = new HashMap<String, Object>();
protected final void definirParametros(String... nomesParametros) {
for (String nome: nomesParametros) {
parametros.put(nome, null);
}
}
protected final void limparParametros() {
for (String parametro: parametros.keySet()) {
parametros.put(parametro, null);
}
}
public final Map<String, Object> getParametros() {
return parametros;
}
public final void setParametros(Map<String, Object> parametros) {
this.parametros = parametros;
}
// Outros métodos omitidos.
}
Como usá-lo? Suponha que estamos construindo um managed bean responsável pelas operações de login do usuário (que contém os campos nome e senha). Ele pode ser implementado escrevendo-se o código abaixo:
public class LoginBean extends ControllerBean {
public LoginBean() {
// Definindo dois campos para a página de login.
super.definirParametros("login", "senha");
}
public String efetuarLogin() {
// A classe ApplicationServiceFactory foi apresentada no post anterior.
Usuario usuario = ApplicationServiceFactory
// Obtendo o service de usuário, que realizará o login.
.getUsuarioService()
// Passando diretamente o Map contendo os campos.
.efetuarLogin(super.getParametros());
// Restante do código omitido.
}
}
Na página JSF correspondente a esse managed bean teríamos controles referenciando os parâmetros da seguinte forma:
<h:inputText value="#{loginBean.parametros['login']}" />
<h:inputText value="#{loginBean.parametros['senha']}" />
O ganho com essa abordagem aparece principalmente quando uma página possui muitos campos. Assim não precisa ficar replicando os atributos da entidade no managed bean, e nem mesmo usar a própria entidade - e se ver obrigado a usar getters e setters que expõem aqueles atributos que não seriam interessante expor. Sem contar que essa forma abre espaço para usar reflection para automatizar a passagem dos valores dos atributos para a entidade correspondente.
Quaisquer sugestões ou dúvidas podem ser apresentadas na seção de comentários.
Até lá!