Camada de serviço no modelo anêmico

Boa tarde pessoas,

Estou fazendo um projeto utilizando o o modelo anêmico, separando dados do comportamento.
Andei lendo alguns artigos, e todos dizem que os DAOs nunca podem estar na camada controladora, ou seja, nas minhas actions. Porém, isso me causa um grande problema: eu preciso carregar um list/menu com valores vindo do banco de dados na minha jsp, e para isso precisaria de um DAO na minha action. Se eu criar um método que retorne os valores de menu na minha camada de serviço, acho que vai ficar muito porco.
O que eu devo fazer? Alguma ideia ou sugestão?

Muito obrigado desde já e abraços.

Se o serviço retorna um POJO não vejo como porco.

Modelo anêmico? Esse livro de arquitetura é para você.

Se precisa ou quer por algum motivo usar ou manter um modelo anêmico, ainda pode separar estas responsabilidade conforme deseja, por exemplo assim:
view -> controller -> services -> pojo’s

Neste exemplo, o acesso a banco seria, ou diretamente nos services, ou então invocado nos services em caso de desejar ter DAO’s.

Perceba a separação conceitual entre controllers e services, de forma a isolar ao máximo a lógica funcional de fora dos controllers. Também, usando services você tira dos controllers a responsabilidade de uso de múltiplos DAO’s e coisas como controle de transação etc

Se não estiver claro, dá uma olhada no livro Domain-Driven Design, do autor Eric Evans, apaptando o modelo sugerido por ele à sua necessidade.
MAS, é de se pensar se realmente precisa de modelo anêmico, talvez não precise…

Primeiramente: muito obrigado a todos vocês!

javaflex

Vou dar um pequeno exemplo.

Eu tenho as classes Lote, Nota e TipoNota, sendo que Lote tem uma lista de Notas, e TipoNota existe apenas para armazenar os valores dos tipos de notas disponíveis no banco de dados.
Para os lotes, eu tenho que salvá-los no banco de dados, juntamente com cada nota fiscal q ele contem.
Porém, os lotes, além de serem lançados (salvos no banco de dados), também podem ser movimentados e encerrados.
Para isso, criei as classes service Lancamento, Movimentacao e Encerramento, que recebem os objetos Lote, Nota e TipoNota, sendo as primeiras responsáveis por fazer as alterações no banco de dados.
Portanto, se eu criar uma classe do tipo NotaService ou TipoNotaService apenas para me retornar os tipos de Nota através de TipoNota, não ficaria meio estranho?
Como populo meus formulários HTML quando preciso buscar os tipos de nota disponíveis no banco de dados e que devem popular o objeto do tipo TipoNota?

Muito obrigado pela atenção, abraços.

[quote]Se precisa ou quer por algum motivo usar ou manter um modelo anêmico, ainda pode separar estas responsabilidade conforme deseja, por exemplo assim:
view -> controller -> services -> pojo’s[/quote]

Muito obrigado por estar me ajudando, icarocd!
Então, creio eu estar dividindo o sistema dessa forma, pois minhas views chamam os controllers, que por sua vez chamam os services para realizar a persistência. Eu apenas não consegui entender a última parte, que sai do service para o pojo. Não deveria ser view -> controller -> services -> dao’s?

Vou dar um exemplo de como estou fazendo:

[code]public class Movimentacao {

private MovimentacaoDAO dao = new MovimentacaoDAO;

public Movimentacao() {

}

public void encaminhar(Lote lote) {
dao.encaminhar(lote);
}
[/code]

E em meu controller, pulando as anotações do Spring MVC, pra ficar mais legível:

public void encaminharLote() { Lote lote = new Lote(); // aqui é criado o lote de notas com os parametros da requisição Movimentacao movimentacao = new Movimentacao(); movimentacao.encaminhar(lote); }

Então estou trabalhando assim, com as classes service Lancamento, Movimentacao e Encerramento, que considero como minhas classes service, manipulando as classes Lote, Nota e TipoNota para persistir notas fiscais no banco de dados. A grande dúvida é: de quem é a responsabilidade de buscar os tipos de notas presentes no banco de dados, e popular a classe TipoNota, para eu exibir no meu formuário HTML? Alguma classe como “TipoNotaService”? Eu acho que fica muito vago e sem sentido no sistema, o que vc acha?

Cara, muito obrigado por tudo até agora, um grande abraço!

O pedaço “services -> pojo’s” na parte que falei tu pode ignorar, foi didatico apenas para indicar que os services podem estar interagindo e utilizando diferentes entidades distintas…

Você ta fazendo certo.
A principio me confudiu porque seus services usam nomes ‘comuns’, enquanto outras pessoas usam terminações blaService etc mas fica a seu criterio.

Quanto à pergunta de se cria ou nao um service novo para tipo de nota, isto depende do seu modelo, analise a necessidade ou nao mas esta duvida nao é de tecnologia e sim de modelagem (voce consegue responde-la)

Olá icarocd,

Então, de acordo com a minha modelagem este service não é necessário, mas sim para a parte de infraestrutura, pois preciso exibir esses valores no formulário. Devo recorrer a outra solução né? Tem algo a aconselhar?

Ah, quanto ao livro, comprei ele faz um tempinho, estou realmente precisando ler.

Abraços!

[quote=$ERVER]Primeiramente: muito obrigado a todos vocês!

javaflex

Vou dar um pequeno exemplo.

Eu tenho as classes Lote, Nota e TipoNota, sendo que Lote tem uma lista de Notas, e TipoNota existe apenas para armazenar os valores dos tipos de notas disponíveis no banco de dados.
Para os lotes, eu tenho que salvá-los no banco de dados, juntamente com cada nota fiscal q ele contem.
Porém, os lotes, além de serem lançados (salvos no banco de dados), também podem ser movimentados e encerrados.
Para isso, criei as classes service Lancamento, Movimentacao e Encerramento, que recebem os objetos Lote, Nota e TipoNota, sendo as primeiras responsáveis por fazer as alterações no banco de dados.
Portanto, se eu criar uma classe do tipo NotaService ou TipoNotaService apenas para me retornar os tipos de Nota através de TipoNota, não ficaria meio estranho?
Como populo meus formulários HTML quando preciso buscar os tipos de nota disponíveis no banco de dados e que devem popular o objeto do tipo TipoNota?

Muito obrigado pela atenção, abraços.[/quote]
Você tem algum serviço “NotaFiscal” (ou similar) para atender este processo relacionado diretamente a Notas? Nele poderia ter mais um método para retornar os tipos das mesmas.

Este método vai retornar um POJO para sua controller, e sua controller retornar para o client um json a partir do objeto Java, ou do jeito que estiver fazendo, que parece ser processando o HTML por JSP lendo o objeto, ai é decisão sua de como vai renderizar o HTML.