CRUD e Serviços

WS RESTful:

@Path("contatos")
public class ContatoResource {

    @Inject // CDI
    private IContatoService service;

    // @GET, @POST, @PUT, @DELETE ...
}

Service:

public class ContatoService implements IContatoService {

    @Inject // CDI
    private IContatoDao dao;

    // salvar(), remover(), buscar() ...
}

DAO:

public class ContatoDao extends GenericDao<Contato> implements IContatoDao {
   // vazio. 
  // apenas estende as funcionalidades do DAO Genérico (à princípio)
}

Me incomoda um pouco esse esquema:

  • O recurso chama a service que chama o DAO que por sua vez, estende um DAO Genérico que, enfim, contém as operações finais.

Digo, este é mesmo o caminho correto? Seria “errado” injetar o DAO direto no endpoint?

Se for considerar uma aplicação real e não um CRUD acadêmico, o “Service” (ou seja lá onde for ficar a lógica de negócio) vai fazer mais coisas do que apenas chamar um método genérico de acesso a banco. Mais de um “Resource” pode aproveitar o mesmo Service, com assinaturas diferentes. Caso contrário teria que fazer um resource com milhares de possibilidades. Geralmente ele deve fazer só o meio de campo.

Por que vc continua usando DAO, um padrão Java EE da época da Sun Microsystem, quando o próprio banco de dados já virou um serviço?