1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Como colocar Interfaces Java entre camadas projeto JSF

Olá pessoal, sei que é um assunto básico e entendo os conceitos, mas tô meio perdido no quesito Interfaces Java. Tenho uma aplicação Web onde tenho as seguintes camadas:

  • Modelo(POJOS/Entidades JPA)
  • DAO
  • Servicos
  • Controladores(Managed Beans)
  • View(Páginas XHTML)

O projeto está funcioando perfeitamente mas surgiu um problema: Preciso adicionar Interfaces Java entre cada camada dessas, com o intuito de desacoplar ao máximo. O problema mesmo é que não tô sabendo interligar e implementar ou extender(interface para interface) corretamente as interfaces.

No DAO, tenho uma interface com todas as assinaturas de métodos do CRUD básico:

public interface DAO<T> {

    public EntityManager getEntidadeManager();

    void salvar(T entidade) throws UBSExcecao;

    void delete(T entidade) throws UBSExcecao;

    List<T> buscarTodos() throws UBSExcecao;

    T porId(Long id) throws UBSExcecao;
}

Depois tenho um DAO abstrato que implementa essa interface:

public abstract class DaoAbstrato<T> implements Serializable, DAO<T> {

    @Inject
    private EntityManager entityManager;

    private Class<T> entidade;

    @SuppressWarnings("UnusedAssignment")
    public DaoAbstrato(Class<T> entityClass) {
        Type tipo = getClass().getGenericSuperclass();
        ParameterizedType pt = (ParameterizedType) tipo;
        tipo = (Class) pt.getActualTypeArguments()[0];
    }


    public EntityManager getEntityManager() {
        return entityManager;
    }

    @Override
    public void salvar(T entity) throws UBSExcecao{
        entityManager.merge(entity);
    }

    @Override
    public void delete(T entity) throws UBSExcecao{
        entityManager.remove(entity);
    }

    @Override
    public List<T> buscarTodos() throws UBSExcecao{
        CriteriaQuery cq = getEntidadeManager().getCriteriaBuilder().createQuery();
        cq.select(cq.from(entidade));
        return getEntidadeManager().createQuery(cq).getResultList();
    }

    @Override
    public T porId(Long id) throws UBSExcecao{
        return entityManager.find(entidade, id);
    }

    @Override
    public Class<T> getEntidade() {
        return entidade;
    }

    public void setEntidade(Class<T> entidade) {
        this.entidade = entidade;
    }
}

A partir daí sei que tenho que criar classes concretas para implementar os métodos mas não sei se implementa a interface ou extend a classe abstrata ou os dois.

No service tenho exatamente a mesma coisa só que na interface do service eu dou um extends na interface do DAO e no servico abstrato eu dou um implements na interface do service. Está certo?

Interface Servico

public interface Servico<T> extends DAO<T>{

    @Override
    public EntityManager getEntidadeManager();

    @Override
    void salvar(T entidade) throws UBSExcecao;

    @Override
    void delete(T entidade) throws UBSExcecao;

    @Override
    List<T> buscarTodos() throws UBSExcecao;

    @Override
    T porId(Long id) throws UBSExcecao;

}

Servico Abstrato

public abstract class ServicoAbstrato<T> implements Serializable, Servico<T> {

    public abstract DAO getDao();

    @SuppressWarnings("UnusedAssignment")
    public ServicoAbstrato(Class<T> entidadeClasse) {
        Type tipo = getClass().getGenericSuperclass();
        ParameterizedType pt = (ParameterizedType) tipo;
        tipo = (Class) pt.getActualTypeArguments()[0];
    }

    @Transactional
    @Override
    public void salvar(T entidade) throws UBSExcecao{
        getDao().salvar(entidade);
    }

    @Transactional
    @Override
    public void delete(T entidade) throws UBSExcecao{
        getDao().delete(entidade);
    }

    @Override
    public List<T> buscarTodos() throws UBSExcecao{
        return getDao().buscarTodos();
    }

    @Override
    public T porId(Long id) throws UBSExcecao{
        return (T) getDao().porId(id);
    }
}

Aqui o mesmo problema que no DAO, pois não sei se as classes concretas implementam a interface do serviço ou extend a classe abstrata do serviço ou os dois.

Também vi que pode-se criar uma interface para os ManagedBeans mas se eu conseguir fazer até no service, já me dou por satisfeito.

Obrigado e espero que possam ajudar! Desculpem o tamanho do texto mas quis explicar o máximo possível.

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

2 respostas

Não é a resposta que estava procurando? Procure outras perguntas com as tags jsf interface java dao ou faça a sua própria pergunta.