Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Warnig no @ViewScoped e @RequestScoped

Bom dia. Já verifiquei todos os arquivos e não sei pq fica um warning no @ViewScoped e @RequestScoped Tá acontecendo isso em duas classes que o usa segue abaixo

package br.com.caelum.livraria.bean;



import java.io.Serializable;

import javax.enterprise.context.RequestScoped;
import javax.faces.application.FacesMessage;

import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;

import br.com.caelum.livraria.dao.UsuarioDao;
import br.com.caelum.livraria.modelo.Usuario;


@Named
@RequestScoped
public class LoginBean implements Serializable {

    private static final long serialVersionUID = 1L;

    private Usuario usuario = new Usuario();

    private UsuarioDao usuarioDao;

    @Inject
    public LoginBean(UsuarioDao usuarioDao){
        this.usuarioDao = usuarioDao;
    }


    public Usuario getUsuario() {
        return usuario;
    }

    public String efetuaLogin() {
        System.out.println("fazendo login do usuario " + this.usuario.getEmail());

        FacesContext context = FacesContext.getCurrentInstance();
        boolean existe = usuarioDao.existe(this.usuario);
        if(existe ) {
            context.getExternalContext().getSessionMap().put("usuarioLogado", this.usuario);
            return "livro?faces-redirect=true";
        }

        context.getExternalContext().getFlash().setKeepMessages(true);
        context.addMessage(null, new FacesMessage("Usu�rio n�o encontrado"));

        return "login?faces-redirect=true";
    }

    public String deslogar() {
        FacesContext context = FacesContext.getCurrentInstance();
        context.getExternalContext().getSessionMap().remove("usuarioLogado");
        return "login?faces-redirect=true";
    }
}

Warning Type LoginBean (with a non-private constructor with no parameters) is not a legal type of normal scoped bean LoginBean because it cannot be proxied by the container [JSR-346 §3.15]

package br.com.caelum.livraria.bean;


import java.io.Serializable;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;

import br.com.alura.alura_lib.dao.DAO;
import br.com.caelum.livraria.modelo.Autor;
import br.com.caelum.livraria.modelo.Livro;


@Named
@ViewScoped
public class LivroBean implements Serializable {

    private static final long serialVersionUID = 1L;

    private Livro livro = new Livro();

    private Integer autorId;

    private List<Livro> livros;

    private DAO<Autor> autorDao;

    private DAO<Livro> livroDao;

    @Inject
    public LivroBean(DAO<Livro> livroDao, DAO<Autor> autorDao){
        this.livroDao = livroDao;
        this.autorDao = autorDao;
    }

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

    public Integer getAutorId() {
        return autorId;
    }

    public Livro getLivro() {
        return livro;
    }

    public List<Livro> getLivros() {

        if(this.livros == null) {
            this.livros = livroDao.listaTodos();
        }
        return livros;
    }

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

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

    public void carregarLivroPelaId() {
        this.livro = livroDao.buscaPorId(this.livro.getId()); 
    }

    public void gravarAutor() {
        Autor autor = autorDao.buscaPorId(this.autorId);
        this.livro.adicionaAutor(autor);
        System.out.println("Escrito por: " + autor.getNome());
    }

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

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


        if(this.livro.getId() == null) {
            livroDao.adiciona(this.livro);
            this.livros = livroDao.listaTodos();
        } else {
            livroDao.atualiza(this.livro);
        }

        this.livro = new Livro();
    }

    public void remover(Livro livro) {
        System.out.println("Removendo livro");
        livroDao.remove(livro);
        this.livros = livroDao.listaTodos();
    }

    public void removerAutorDoLivro(Autor autor) {
        this.livro.removeAutor(autor);
    }

    public void carregar(Livro livro) {
        System.out.println("Carregando livro");
        this.livro = livro;
    }

    public String formAutor() {
        System.out.println("Chamanda do formul�rio do Autor.");
        return "autor?faces-redirect=true";
    }

    public void comecaComDigitoUm(FacesContext fc, UIComponent component,
            Object value) throws ValidatorException {

        String valor = value.toString();
        if (!valor.startsWith("1")) {
            throw new ValidatorException(new FacesMessage(
                    "ISBN deveria come�ar com 1"));
        }

    }
}

Warning Type LivroBean (with a non-private constructor with no parameters) is not a legal type of normal scoped bean LivroBean because it cannot be proxied by the container [JSR-346 §3.15]

EDITADO Copiei e colei as classes que estão disponibilizada no curso

3 respostas
solução!

Olá Camila tudo bem?

O warning ocorre pois segundo a especificação do CDI (JSR-346) mais especificamente no §3.15 diz que "Se sua classe não tiver um construtor não privado sem argumentos, o container não pode gerar um proxy para essa classe." Isso não é um erro é somente um aviso, do weld que talvez ele tenha que te entregar uma instancia de verdade ao invés de um proxy.

É bem comum frameworks/specs pedirem que suas classes tenha um construtor não private sem argumentos. Para que eles consigam instanciar sua classe e depois tomar alguma ação (no caso do CDI para injetar as dependências que você pediu).

Mas para remover esse warning, faça uma sobrecarga de construtores nas classes que estão gerando esse warning.

Por exemplo:

public class MinhaClasseQueGeraWarning {
    private AlgumDao dao;
    ...


    public MinhaClasseQueGeraWarning(){}

    @Inject
    public MinhaClasseQueGeraWarning(AlgumDao dao){
        this.dao = dao;
    }
    ...
}

Caso queria entender melhor sobre a spec do CDI, vou deixar um link com a documentação da mesma:

http://download.oracle.com/otndocs/jcp/cdi-1_2-mrel-eval-spec/

Espero ter ajudado

Muito obrigada

De nada! =)

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software