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);
}
}