2015-04-16 6 views
3

Я просто тестирую эту страницу JSF, поэтому я не устанавливаю атрибут action в <h:commandButton/>. Это очень простая форма с тремя полями ввода для имени, имени и электронной почты и одной кнопкой «Сохранить». Каждый раз, когда я нажимаю на эту кнопку, я получаю эту ошибкуПосле переключения @ManagedBean на @Named: javax.el.PropertyNotFoundException: Target Unreachable, идентификатор 'person' разрешен к нулю

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

, но если я аннотирования мой JavaBean @ManagedBean, то форма пройти просто отлично, но каждый раз, когда я переключаюсь обратно с помощью @Named Bean, я получаю эту ошибку еще раз , Я пробовал некоторые из предложений, которые я нашел на этом сайте, таких как перезапуск сервера, проверка наличия геттеров, но это не помогло.

<?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> 

Это мой 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; 
    } 
} 

Это 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> 
+0

Какой контейнер? – BalusC

+0

О, я забыл упомянуть, что это GlassFish 4.1. – Dummy

+0

Должно быть, просто выработать поле в контейнере Java EE 7. У вас есть '/ WEB-INF/beans.xml'? – BalusC

ответ

1

Это лучший ответ на мою проблему. LINK . Кроме того, файл cdi-1.2 jar недоступен в GS 4.1 по какой-то причине, поэтому пакет javax.enterprise.* не было в моем Netbeans, мне пришлось вручную загрузить эту банку с http://cdi-spec.org/. Теперь все работает отлично, включая DI. И мне не нужно было создавать файлы конфигурации, чтобы заставить его работать.

+0

Он доступен в GlassFish 4.1 как очевидный, который уже является Java EE-совместимым контейнером, но эти классы упакованы в библиотеку с именем 'Java EE 7 API' Library, содержащую один большой JAR-файл с именем' javaee-api-7.0.jar' ,Вы можете добавить эту библиотеку к пути класса компиляции вашего веб-модуля, когда это необходимо. Нет необходимости добавлять библиотеку CDI отдельно по мере необходимости в контейнеры с сервлетами с голубыми костями, такими как Apache Tomcat, Eclipse Jetty. – Tiny

+0

Причина, по которой CDI 1.2 jar недоступна в GlassFish 4.1, заключается в том, что он упаковывает CDI 1.1. –

+0

@Tiny спасибо за информацию. – Dummy

1

Основная проблема заключается в том, что вы используете аннотации JSF вместо аннотаций CDI. Чтобы исправить это, изменить импорт:

import javax.faces.bean.RequestScoped; 

в

import javax.enterprise.context.RequestScoped; 

Однако другое решение создать beans.xml файл.

Чтобы сделать это, создайте в WEB-INF папку со следующим содержанием:

<?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> 

Наличие файла beans.xml сигнализирует контейнер сервлетов, который приложение использует JSR-299 (контексты и Injection Dependency) - без него, классы приложения не будут сканироваться для CDI аннотаций, и инъекция зависимостей не будет выполнена. Если вы не используете CDI (например, вы используете только обычные управляемые компоненты JSF), вам не нужно beans.xml. .

Смотрите также:

+2

Э-э! Java EE 7 (GlassFish 4.1). 'beans.xml' не требуется, если явно не требуется. – Tiny

+0

Эй, это работает. Почему это? Разве спецификации Java EE не указывают, что файлы конфигурации являются необязательными? – Dummy

+0

Извините, я думаю, что это скорее хак, а постоянное решение. – Dummy

1

Вы должны изменить ваш запрос с областью видимости аннотацию лица к КДИ.

Причина в том, если вы посмотрите на аннотациях

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

@Named 
@RequestScoped 

Ни один из них не являются КДИ «боб определения аннотаций», так что если вы используете bean-discovery-mode="annotated" это не будет работать для вас.

+0

и почему это проголосовали? –

+0

Потому что ничего не объяснил. Объясните, как ловить рыбу вместо того, чтобы давать рыбу. – BalusC

+0

Это не помогло – Dummy