Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Usando CDI para injetar Dao Genérico

Assintindo a vídeo aula, achei ruim ter que criar muitos DAOs e ter que delegar ao DAO genérico simplesmente para usar CDI. Assim fiz um outra implementação, que não precisa criar vários DAOs e ainda assim uso CDI. Tem algum problema em usar dessa forma?

public class JpaProducer {
    private static final EntityManagerFactory ENTITY_MANAGER_FACTORY = createEntityManagerFactory("livraria");

    @Inject
    private EntityManager entityManager;

    @Produces
    @RequestScoped
    public EntityManager newEntityManager() {
        return ENTITY_MANAGER_FACTORY.createEntityManager();
    }

    public void close(@Disposes EntityManager em) {
        em.close();
    }

    @Produces
    public <T extends Serializable> DAO<T> newInstance(InjectionPoint injectionPoint){
        ParameterizedType type = (ParameterizedType) injectionPoint.getType();
        Class classe = (Class) type.getActualTypeArguments()[0];

        return new DAO<>(classe, entityManager);
    }
}

@Named
@ViewScoped
public class LivroBean implements Serializable {
    private static final long serialVersionUID = 8355971869549160737L;

    @Inject
    private Livro livro;
    @Inject
    private LivroDataModel livroDataModel;
    @Inject
    private DAO<Autor> autorDao;
    @Inject
    private DAO<Livro> livroDao;
    @Inject
    private Instance<LivroService> livroServiceInstance;

    private Integer autorId;
    private List<Livro> livros;

    public Livro getLivro() {
        return livro;
    }

    public void gravar() {
        System.out.println("Gravando livro " + this.livro.getTitulo());

        if (livro.getAutores().isEmpty()) {
            FacesContext.getCurrentInstance().addMessage("autor", new FacesMessage(FacesMessage.SEVERITY_ERROR,
                    "Livro sem autor", "Livro deve ter pelo menos um Autor"));
            return;
        }

        livroServiceInstance.get().salvarLivroComAutores(livro);
        atualizaListaLivros();
        this.livro = new Livro();
    }

    public List<Genero> getGeneros(){
        return Arrays.asList(Genero.values());
    }

    public void associarAutor() {
        Autor autor = autorDao.buscaPorId(autorId);
        livro.adicionaAutor(autor);

        this.autorId = null;
    }

    public void setAutorId(Integer autorId) {
        this.autorId = autorId;
    }

    public List<Autor> getAutores() {
        return livro.getAutores();
    }

    public Integer getAutorId() {
        return this.autorId;
    }

    public List<Autor> listarAutoresNaoSelecionados() {
        List<Autor> autoresNaoSelecionados = autorDao.listaTodos();
        autoresNaoSelecionados.removeAll(livro.getAutores());

        return autoresNaoSelecionados;
    }

    public List<Livro> getLivros() {

        if (livros == null) {
            atualizaListaLivros();
        }

        return livros;
    }

    private void atualizaListaLivros() {
        this.livros = livroDao.listaTodos();
    }

    public boolean precoEhMenor(Object valorColuna, Object filtroDigitado, Locale locale) {

        if (StringUtils.isBlank((String) filtroDigitado)) {
            return true;
        }

        if (valorColuna == null) {
            return false;
        }

        try {
            Double precoDigitado = Double.valueOf(filtroDigitado.toString().trim());
            Double precoColuna = (Double) valorColuna;

            return precoColuna.compareTo(precoDigitado) < 0;

        } catch (NumberFormatException e) {
            return false;
        }
    }

    public LivroDataModel getLivroDataModel() {
        return livroDataModel;
    }

    public void validarIsbn(FacesContext facesContext, UIComponent uiComponent, Object value) throws ValidatorException {
        new IsbnValidator().validate(facesContext, uiComponent, value);
    }

    public View cadastrarNovoAutor() {
        return new RedirectView("autor");
    }

    @Transactional
    public void remover(Livro livro) {
        livroDao.remove(livro);

        System.out.printf("Apagando livro (id %d) com título %s ", livro.getId(), livro.getTitulo());

    }

    public void setLivro(Livro livro) {
        this.livro = livro;
    }

    public void removerAssociacaoCom(Autor autor) {
        this.livro.remover(autor);
    }
}
1 resposta
solução

Não tem problema.. é uma solução realmente mais genérica :).