1
resposta

Problemas na injeção do Bean

Acredito que seja um erro básico, mas sempre que dou o submit, dá erro de target unreachable, é como se o CDI não estivesse injetando o bean.

Exception:

javax.servlet.ServletException: /livros/form2.xhtml @12,59 value="#{livrosBean.livro.titulo}": Target Unreachable, identifier 'livrosBean' resolved to null
javax.faces.webapp.FacesServlet.service(FacesServlet.java:671)
io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85)
io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:284)
io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:263)
io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:174)
io.undertow.server.Connectors.executeRootHandler(Connectors.java:202)
io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:793)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
java.lang.Thread.run(Thread.java:745)

Esse é o bean

package ao.com.casadocodigo.beans;

import java.io.Serializable;

import javax.enterprise.context.RequestScoped;
import javax.inject.Named;

import ao.com.casadocodigo.entities.Livro;

@Named
@RequestScoped
public class LivrosBean implements Serializable{
    private static final long serialVersionUID = 1L;

    private Livro livro = new Livro();

    public void salvar() {
        System.out.println("Salvou");
    }

    /**
     * @return the livro
     */
    public Livro getLivro() {
        return livro;
    }

    /**
     * @param livro the livro to set
     */
    public void setLivro(Livro livro) {
        this.livro = livro;
    }
}

Esse é o form:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core">

    <h:form>
        <div>
            <h:outputLabel value="Título" />
            <h:inputText value="#{livrosBean.livro.titulo}" />
        </div>
        <div>
            <h:outputLabel value="Descrição"/>
            <h:inputTextarea rows="4" cols="20" value="#{livrosBean.livro.descricao}" />
        </div>
        <div>
            <h:outputLabel value="Número de Páginas"/>
            <h:inputText value="#{livrosBean.livro.numeroPaginas}" />
        </div>
        <div>
            <h:outputLabel value="Preço"/>
            <h:inputText value="#{livrosBean.livro.preco}" />
        </div>
        <h:commandButton value="Cadastrar" action="#{livrosBean.salvar}" />
    </h:form>

</html>

beans.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" bean-discovery-mode="all" version="1.1" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"/>

faces

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.1" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_1.xsd"/>

Está tudo de acordo com o curso e como o forge gera os artefatos. Gostaria de um auxílio.

1 resposta

Rafael, a primeira vista, teu código era pra estar funcionando. Como não deu certo, faz o teu Bean assim:

@Named
@RequestScoped
public class LivrosBean implements Serializable{

    private static final long serialVersionUID = 1L;
    private Livro livro;

    @PostConstruct
    public void init() {
        this.livro = new Livro();
    }
    public void salvar() {
        System.out.println("Salvou");
    }
    public Livro getLivro() {
        return livro;
    }
    public void setLivro(Livro livro) {
        this.livro = livro;
    }
}

O método anotado com @PostConstruct é um callback.

@PostConstruct
public void init() {
    this.livro = new Livro();
}

Ele será executado sempre que o Bean for criado, imediatamente após a sua criação.

Se não funcionar, altera o método salvar() para:

public String salvar() {
    System.out.println("Salvou");
    return "form2?faces-redirect=true";
}

Isso irá forçar um redirect na página e a recriação do bean.

Faz os testes e dá um retorno.

Abraço.

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