Olá
Há algum tempo eu postei aqui uma pergunta de como seria uma maneira legal de se passar os dados da camada view para a camada de aplicação(service, manager ). Seguem os links da pergunta.
http://www.guj.com.br/posts/list/33027.java#177354
http://www.guj.com.br/posts/list/30/33027.java#179979
O projeto que eu trabalhava na época adotou a 3ª opção.
“Começar a criar o obj na action, a parte simples tipo setNome e etc, e passar esse quase obj para o factory method terminar o serviço.”
Problemas encontrados: Os managed beans (JSF) ficaram inchados e muitas vezes com alguma lógica de negócio. Isso aconteceu naturalmente um vez que o objeto é instanciado no próprio MB. Existem muitas injeções de dependência neles pois o domínio do projeto tem muitas relações, é quase impossível criar um objeto sem que ele seja relacionado com uma penca de outros.
Outro problema foi o tratamento dos updates, para não ter o problema de ler dois objetos com o mesmo ID na mesma sessão do hibernate.
Solução: Eu estava fazendo um projeto para testar o Spring2 JPA e etc e tive a seguinte idéia. Usar a opção 2:
"No caso de um app web (o meu caso) passar o form bean (Struts), ou managed bean(JSF)."
Mas com algumas diferenças, uma interface com as propriedades que eu preciso do Managed Bean (Ex. getNome, getTelefone…). O MB implementa essa interface. Meu service recebe como argumento um tipo dessa interface para salvar no repository.
Segue o código de exemplo:
Interface RawData
[code]/**
-
Interface que fornece os dados para serem gravados na entidade.
-
@author Fábio J. Mendes
*/
public interface UsuarioRawData {String getNome();
String getTelefone();
String getEstadoCivilStr();
String getRua();
Integer getNumero();
String getComplemento();
String getCep();
}[/code]
Service, o insert recebe um tipo RawData e o update recebe um id e o RawData:
[code]/**
- @author Fábio J. Mendes
*/
public interface UsuarioService {
List<Usuario> findAll();
Usuario findById(Long id);
void insert(UsuarioRawData data);
void update(Long id, UsuarioRawData data);
void remove(Long idUsuario);
}[/code]
Action chamando o service e passando this como argumento:
[code]public class CadastroUsuarioAction extends ActionSupport implements UsuarioRawData {
//Propriedades…
@Override
public String execute() throws Exception {
try {
if(idUsuario == null) {
log.debug("Salvando um novo usuário");
usuarioService.insert(this);
} else {
log.debug("Salvando o usuario - id: " + idUsuario);
usuarioService.update(idUsuario, this);
}
} catch (RuntimeException e) {
return ERROR;
}
return SUCCESS;
}
//getters & setters e outros metodos…
}[/code]
O que vocês acham dessa solução?