2014-01-29 3 views
0

Я получаю исключение null-указателя, когда пытаюсь запустить событие в приложении Java EE. Ниже приведен код.Null pointer Исключение для javax.enterprise.event.Event

HelloEvent модель событий:

package com.eventhandling; 

import java.io.Serializable; 
import java.util.logging.Logger; 


public class HelloEvent implements Serializable { 
    private static final long serialVersionUID = 1L; 
    private String message; 
    private static Logger LOGGER=Logger.getLogger("Log"); 
    public HelloEvent() { 
    } 

    public HelloEvent(String message) { 
     this.message = message; 
    } 

    public String getMessage() { 
     return message; 
    } 

    public void setMessage(String message) { 
     this.message = message; 
    } 

    @Override 
    public String toString() { 
     // TODO Auto-generated method stub 
     return "helloEvent toString"; 
    } 


} 

HelloMessenger управляемый компонент:

package com.eventhandling; 

import java.util.logging.Logger; 

import javax.annotation.PostConstruct; 
import javax.enterprise.event.Event; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.SessionScoped; 
import javax.inject.Inject; 


@ManagedBean(name = "messenger") 
@SessionScoped 
public class HelloMessenger { 

    @Inject 
    Event<HelloEvent> events; 
    private static Logger LOGGER = Logger.getLogger("Log"); 

    public void hello() { 
     LOGGER.info("hello called"); 
     LOGGER.info("events" + events); 
     HelloEvent helloEvent= new HelloEvent("testEvent"); 
     LOGGER.info("helloEvent"+helloEvent); 
     events.fire(helloEvent); 

    } 

} 

HelloListener событие Слушатель:

package com.eventhandling; 

import javax.enterprise.event.Observes; 
import javax.faces.bean.SessionScoped; 

@SessionScoped 
public class HelloListener { 

    public void listenToHello(@Observes HelloEvent helloEvent) { 

     System.out.println("HelloEvent: " + helloEvent); 

    } 

} 

вид JSF Welcome.xhtml:

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

    <h:head> 
     <title>JSF 2.0 Hello World</title> 
    </h:head> 
    <h:body bgcolor="white"> 
     <h3>JSF 2.0 Hello World Example - welcome.xhtml</h3> 
     <h4>Welcome </h4> 
     <h:form> 
      <h:commandButton value="Fire Event" action="#{messenger.hello}"></h:commandButton> 
     </h:form> 
    </h:body> 
</html> 

Maven зависимостей:

 <dependency> 
      <groupId>com.sun.faces</groupId> 
      <artifactId>jsf-api</artifactId> 
      <version>2.1.7</version> 
     </dependency> 
     <dependency> 
      <groupId>com.sun.faces</groupId> 
      <artifactId>jsf-impl</artifactId> 
      <version>2.1.7</version> 
     </dependency> 

     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>jstl</artifactId> 
      <version>1.2</version> 
     </dependency> 

     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>servlet-api</artifactId> 
      <version>2.5</version> 
     </dependency> 

     <dependency> 
      <groupId>javax.servlet.jsp</groupId> 
      <artifactId>jsp-api</artifactId> 
      <version>2.1</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.enterprise</groupId> 
      <artifactId>cdi-api</artifactId> 
      <version>1.0</version> 
     </dependency> 

При нажатии на командную кнопку, а затем я получаю NullPointerException. Это связано с тем, что свойство events не вводится и остается null. Как это вызвано и как я могу его обработать?

Логи на Tomcat загрузки:

Jan 30, 2014 4:43:35 PM org.apache.catalina.core.AprLifecycleListener init 
INFO: Loaded APR based Apache Tomcat Native library 1.1.27 using APR version 1.4 
.6. 
Jan 30, 2014 4:43:35 PM org.apache.catalina.core.AprLifecycleListener init 
INFO: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], ra 
ndom [true]. 
Jan 30, 2014 4:43:36 PM org.apache.catalina.core.AprLifecycleListener initialize 
SSL 
INFO: OpenSSL successfully initialized (OpenSSL 1.0.1d 5 Feb 2013) 
Jan 30, 2014 4:43:37 PM org.apache.coyote.AbstractProtocol init 
INFO: Initializing ProtocolHandler ["http-apr-6080"] 
Jan 30, 2014 4:43:37 PM org.apache.coyote.AbstractProtocol init 
INFO: Initializing ProtocolHandler ["ajp-apr-6006"] 
Jan 30, 2014 4:43:37 PM org.apache.catalina.startup.Catalina load 
INFO: Initialization processed in 3047 ms 
Jan 30, 2014 4:43:37 PM org.apache.catalina.core.StandardService startInternal 
INFO: Starting service Catalina 
Jan 30, 2014 4:43:37 PM org.apache.catalina.core.StandardEngine startInternal 
INFO: Starting Servlet Engine: Apache Tomcat/7.0.42 
Jan 30, 2014 4:43:37 PM org.apache.catalina.startup.HostConfig deployWAR 
INFO: Deploying web application archive D:\software\testtomcat_6080-_Analytics_w 
ars\apache-tomcat-7.0.42\webapps\JavaServerFaces.war 
Jan 30, 2014 4:43:43 PM org.apache.catalina.loader.WebappClassLoader validateJar 
File 
INFO: validateJarFile(D:\software\testtomcat_6080-_Analytics_wars\apache-tomcat- 
7.0.42\webapps\JavaServerFaces\WEB-INF\lib\jsp-api-2.1.jar) - jar not loaded. Se 
e Servlet Spec 2.3, section 9.7.2. Offending class: javax/el/Expression.class 
Jan 30, 2014 4:43:43 PM org.apache.catalina.loader.WebappClassLoader validateJar 
File 
INFO: validateJarFile(D:\software\testtomcat_6080-_Analytics_wars\apache-tomcat- 
7.0.42\webapps\JavaServerFaces\WEB-INF\lib\servlet-api-2.5.jar) - jar not loaded 
. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.cl 
ass 
Jan 30, 2014 4:43:46 PM com.sun.faces.config.ConfigureListener contextInitialize 
d 
INFO: Initializing Mojarra 2.1.7 (SNAPSHOT 20120206) for context '/JavaServerFac 
es' 
Jan 30, 2014 4:43:46 PM com.sun.faces.spi.InjectionProviderFactory createInstanc 
e 
INFO: JSF1048: PostConstruct/PreDestroy annotations present. ManagedBeans metho 
ds marked with these annotations will have said annotations processed. 
Jan 30, 2014 4:43:47 PM org.apache.catalina.startup.HostConfig deployDirectory 
INFO: Deploying web application directory D:\software\testtomcat_6080-_Analytics 
_wars\apache-tomcat-7.0.42\webapps\admin 
Jan 30, 2014 4:43:47 PM org.apache.catalina.startup.HostConfig deployDirectory 
INFO: Deploying web application directory D:\software\testtomcat_6080-_Analytics 
_wars\apache-tomcat-7.0.42\webapps\docs 
Jan 30, 2014 4:43:47 PM org.apache.catalina.startup.HostConfig deployDirectory 
INFO: Deploying web application directory D:\software\testtomcat_6080-_Analytics 
_wars\apache-tomcat-7.0.42\webapps\examples 
Jan 30, 2014 4:43:48 PM org.apache.catalina.startup.HostConfig deployDirectory 
INFO: Deploying web application directory D:\software\testtomcat_6080-_Analytics 
_wars\apache-tomcat-7.0.42\webapps\host-manager 
Jan 30, 2014 4:43:48 PM org.apache.catalina.startup.HostConfig deployDirectory 
INFO: Deploying web application directory D:\software\testtomcat_6080-_Analytics 
_wars\apache-tomcat-7.0.42\webapps\manager 
Jan 30, 2014 4:43:48 PM org.apache.catalina.startup.HostConfig deployDirectory 
INFO: Deploying web application directory D:\software\testtomcat_6080-_Analytics 
_wars\apache-tomcat-7.0.42\webapps\ROOT 
Jan 30, 2014 4:43:48 PM org.apache.coyote.AbstractProtocol start 
INFO: Starting ProtocolHandler ["http-apr-6080"] 
Jan 30, 2014 4:43:48 PM org.apache.coyote.AbstractProtocol start 
INFO: Starting ProtocolHandler ["ajp-apr-6006"] 
Jan 30, 2014 4:43:48 PM org.apache.catalina.startup.Catalina start 
INFO: Server startup in 11372 ms 

ответ

1

Вы, кажется, смешиваясь JSF и CDI концепции в одном управляемом компоненте.

Используйте @Named и @SessionScoped, но убедитесь, что у вас есть правильный @SessionScoped. @ManagedBean следует удалить. javax.enterprise.context - это имя пакета. Если вы используете SessionScoped из JSF, недокументированное поведение произойдет.

Я не уверен в ваших зависимостях, но идентификатор зависит от контейнера, который я предполагаю. Убедитесь, что CDI загружается, просмотрев журнал запуска. Убедитесь, что у вас есть beans.xml в META-INF.

В журнале, который вы вставили в комментарий, ничего не говорится ни о сварке, ни об OpenWebBeans, ни о ваших вложенных зависимостях в pom.xml. Я пришел к выводу, что вы неправильно включили CDI.

Какие у вас варианты?

Вариант 1

Tomcat идет большой с OWB/Weld, но так как OpenWebBeans одни и те же лицензии в качестве контейнера, и это то, что я использую, я предлагаю вам добавить зависимости соответственно этим документы: http://openwebbeans.apache.org/owbsetup_ee.html < - - Объясняет, что вам нужно в зависимости http://openwebbeans.apache.org/download.html < --- Объясняет, как добавить в pom.xml

Я написал эти документы, они не совершенны (СРЮ), но он должен получить ты.

Вариант 2: Переключитесь на tomEE и используйте только в maven. Это версия tomEE, которая включает в себя все, что вам нужно. Мне очень нравится tomEE, и это моя рекомендация по умолчанию. Список рассылки действительно хорош и заставит вас идти в кратчайшие сроки, если у вас возникнут проблемы.

Вариант 3: Используйте Jboss Weld и следуйте их руководству, чтобы начать работу с Tomcat. Должно быть легко найти с помощью Google.

+0

Спасибо за ваш ответ. Я внес изменения, как вы упомянули. и использовал javax.enterprise.context для '@SessionScoped'. Но я получаю следующее исключение: javax.faces.el.EvaluationException: javax.el.PropertyNotFoundException: /welcome.xhtml 14,74 action = "# {messenger.hello}": Целевая недоступность, идентификатор 'messenger' разрешен для null Я тоже получал это исключение, поэтому я использовал «@ManagedBean». Пожалуйста, расскажите мне вероятную причину этого исключения, когда я использую «@Named (« messenger »)» [import javax.inject.Named ;] – user3247376

+0

Также вы можете рассказать мне, как настроить beans.xml в качестве примера, который я выполнил, не отображалось никаких beans.xml .. – user3247376

+0

В WEB-INF вам нужен beans.xml. Файл может быть пустым. Аналогично вам нужен beans.xml в любой банке, которую вы имеете, поместите ее в META-INF. Вам не составит труда разобраться в этой информации. –

Смежные вопросы