jsf jsf-2 cdi managed-bean glassfish-4.1

jsf - Después de cambiar @ManagedBean a @Named: javax.el.PropertyNotFoundException: Target inalcanzable, identificador ''persona'' resuelto a nulo



jsf-2 cdi (3)

Necesita cambiar la anotación de su solicitud de rostros a CDI.

La razón es si miras tus anotaciones

import javax.annotation.PostConstruct; import javax.faces.bean.RequestScoped; import javax.inject.Named; @Named @RequestScoped

Ninguno de estos son CDI "anotaciones definitorias de bean", por lo que si está utilizando bean-discovery-mode="annotated" , no va a funcionar para usted.

Esta pregunta ya tiene una respuesta aquí:

Estoy probando esta página JSF, por lo que no configuro el atributo de action en el <h:commandButton/> . Esta es una forma muy simple con 3 cuadros de entrada para Nombre, Apellido y Correo electrónico, y un botón llamado Guardar. Cada vez que hago clic en ese botón, recibo este error

javax.el.PropertyNotFoundException: /index.xhtml @19,106 value="#{person.firstName}": Target Unreachable, identifier ''person'' resolved to null

pero si anoto mi JavaBean @ManagedBean , el formulario pasará perfectamente, pero cada vez que vuelvo a usar @Named Bean, recibo ese error nuevamente. He intentado algunas de las sugerencias que encontré en este sitio, como reiniciar el servidor, verificar la presencia de los buscadores, pero eso no ayudó.

<?xml version=''1.0'' encoding=''UTF-8'' ?> <!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:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"> <h:head> <meta charset="UTF-8" /> <title>Simple Form Created Using Facelets</title> </h:head> <h:body> <h:messages/> <h:form> <h:panelGrid columns="2" columnClasses="rightColumn, leftColumn"> <h:outputLabel for="firstName" value="First Name:" /> <h:inputText id="firstName" value="#{person.firstName}" label="First Name"/> <h:outputLabel for="lastName" value="Last Name:" /> <h:inputText id="lastName" value="#{person.lastName}" label="Last Name"/> <h:outputLabel for="email" value="Email:"/> <h:inputText id="email" value="#{person.email}" label="Email" /> <h:panelGroup /> <h:commandButton value="Submit"/> </h:panelGrid> </h:form> </h:body> </html>

Esta es mi clase JavaBean

import javax.annotation.PostConstruct; import javax.faces.bean.RequestScoped; import javax.inject.Named; @Named @RequestScoped public class Person { private String firstName = "empty"; private String lastName = "empty"; private String email = "empty"; public void Person() {} public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }

Este es el archivo web.xml .

<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"> <context-param> <param-name>javax.faces.PROJECT_STAGE</param-name> <param-value>Development</param-value> </context-param> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>/faces/*</url-pattern> </servlet-mapping> <session-config> <session-timeout> 30 </session-timeout> </session-config> <welcome-file-list> <welcome-file>faces/index.xhtml</welcome-file> </welcome-file-list> </web-app>


Esta es la mejor respuesta para mi problema LINK . Además, el archivo jar cdi-1.2 no está disponible en GS 4.1 por alguna razón, es por eso que el paquete javax.enterprise. * No estaba presente en mi Netbeans, tuve que descargarlo manualmente de http: // cdi-spec. org / . Ahora todo funciona bien, incluido DI. Y no tuve que crear ningún archivo de configuración para que funcione.


El problema principal es que usas anotaciones JSF en lugar de anotaciones CDI. Para arreglar eso, cambie la importación:

import javax.faces.bean.RequestScoped;

a

import javax.enterprise.context.RequestScoped;

Sin embargo, otra solución es crear un archivo beans.xml .

Para hacerlo, cree uno en la carpeta WEB-INF con el siguiente contenido:

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> </beans>

La presencia de un archivo beans.xml indica al contenedor de servlets que la aplicación utiliza JSR-299 (Contextos e Inyección de Dependencia); sin este, las clases de la aplicación tampoco se analizarán para obtener anotaciones CDI y no se realizará la inyección de dependencia. Si no usa CDI (por ejemplo, solo usa beans gestionados de JSF), no necesita beans.xml.

Ver también: