2014-02-10 4 views
0

Я пытаюсь создать супер простое веб-приложение с входом в Java EE, которое работает на Apache TomEE. При этом я сталкиваюсь с javax.servlet.ServletException, связанным с java.lang.NullPointerException на том, что, по моему мнению, было тупой простой страницей.Java EE и JSF NullPointerException

Некоторые системы и библиотеки Информация:

- CentOS 6.5 
- Eclipse Kepler IDE for Java EE Developers 
- JRE System Library [java-1.7.0-openjdk-1.7.0.45.x86_64] 
- Apache Tomcat v7.0 
- Apache TomEE 1.6.0 JAX-RS 
- JSF Mojara 2.2 (javax.faces.jar) 
- log4j 1.2.17 (log4j-1.2.17.jar) 

Глупо просто Page (home.xhtml):

<!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> 
     <title>LogTest Home</title> 
    </h:head> 

    <h:body> 
     <h1>Testing:</h1> 
     <h:outputText value="#{logTest.foo()}"/> 
    </h:body> 
</html> 

Подложка боб (logTest.java):

package test.pack; 

import javax.faces.bean.ManagedBean; 
import javax.faces.bean.SessionScoped; 

import org.apache.log4j.Logger; 

@ManagedBean(name="logTest") 
@SessionScoped 
public class logTest { 

    private static final Logger LOGGER = Logger.getLogger(logTest.class); 

    private String statusMsg = "Default status"; 

    public String getStatusMsg() { 
     return statusMsg; 
    } 

    public void setStatusMsg(String statusMsg) { 
     this.statusMsg = statusMsg; 
    } 

    public String foo() { 
     LOGGER.info("Currently executing method foo()"); 
     setStatusmsg("Hello foo()!"); 
     return "foo() executed successfully!"; 
    } 
} 

log4j .properties в каталоге/WEB-INF/classes

log4j.rootLogger = TRACE, toConsole, toFile 

#Test File Logs 
log4j.appender.toFile=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.toFile=/opt/tommee/logs/log4jWebapp.log 
log4j.appender.toFile.DatePattern='.'yyyy-MM-dd 
log4j.appender.toFile.layout=org.apache.log4j.PatternLayout 
log4j.appender.toFile.layout.ConversionPattern=%d %5p [%t] - %c%M - %m%n 

#Test Console Logs 
log4j.appender.toConsole=org.apache.log4j.ConsoleAppender 
log4j.appender.toConsole.layout=org.apache.log4j.PatternLayout 
log4j.appender.toConsole.layout.ConversionPattern=%d %5p [%t] - %c%M - %m%n 

Дескриптор развертывания (web.xml)

<?xml version"1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://wwww.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
     http://java.sun.com/xml/ns/javaaee/web-app_3_0.xsd" 
    version="3.0"> 

    <display-name>log4jTEst</display-name> 

    <welcome-file-list> 
     <welcome-filee>faces/home.xhtml</welcome-file> 
    </welcome-file-list> 

    <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> 
    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>*.jsf</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>*.faces</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>*.xhtml</url-pattern> 
    </servlet-mapping> 

    <context-param> 
     <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description> 
     <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
     <param-value>client</param-value> 
    </context-param> 
    <context-param> 
     <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name> 
     <param-value>resources.application</param-value> 
    </context-param> 

    <listener> 
     <listener-class>com.sun.faces.config.ConfigureListener</listener-class> 
    </listener> 

</web-app> 

Теперь, когда я запускаю это на сервере я создал, я вернусь это из браузера Eclipse:

HTTP Status 500- 

type - Exception report 

message 

description - The server encountered an internal error that prevented it from fulfilling this request. 

exception - 

javax.servlet.ServletException 
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:659) 
    org.apachee.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) 

root cause - 

java.lang.NullPointerException 
    javax.el.CompositeELResolver.invoke(CompositeELResolver.java:255) 
    javax.el.CompositeELResolver.invoke(CompositeELResolver.java:255) 
    org.apachee.el.parser.AstValue.getValue(AstValue.java:173) 
    org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:185) 
    com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.jaava:109) 
    javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194) 
    javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182) 
    javax.faces.component.UIOutput.getValue(UIOutput.java:174) 
    com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getValue(HtmlBasicInputRenderer.java:205) 
    com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getCurrentValue(HtmlBasicRenderer.java:355) 
    com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeEnd(HtmlBasicRenderer.java:164) 
    javax.faces.component.UIComponentBase.encodeEnd(UIComponent.java:924) 
    javax.faces.component.UIComponent.encodeALL(UIComponent.java:1863) 
    javax.faces.component.UIComponent.encodeALL(UIComponent.java:1859) 
    javax.faces.component.UIComponent.encodeALL(UIComponent.java:1859) 
    com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:443) 
    com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131) 
    javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337) 
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120) 
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219) 
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:647) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) 

note - the full stack trace of the root cause is available in the Apache Tomcat (TomEE)/7.00.47 (1.6.0) logs 

Вот журнал сервера сразу после запуска:

Feb 10, 2014 4:40:29 PM com.sun.faces.application.view.FaceletViewHandlingStrategy handleRenderException 
SEVERE: Error Rendering View[/home.xhtml] 
java.lang.NullPointerException 
    javax.el.CompositeELResolver.invoke(CompositeELResolver.java:255) 
    javax.el.CompositeELResolver.invoke(CompositeELResolver.java:255) 
    org.apachee.el.parser.AstValue.getValue(AstValue.java:173) 
    org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:185) 
    com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.jaava:109) 
    javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194) 
    javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182) 
    javax.faces.component.UIOutput.getValue(UIOutput.java:174) 
    com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getValue(HtmlBasicInputRenderer.java:205) 
    com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getCurrentValue(HtmlBasicRenderer.java:355) 
    com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeEnd(HtmlBasicRenderer.java:164) 
    javax.faces.component.UIComponentBase.encodeEnd(UIComponent.java:924) 
    javax.faces.component.UIComponent.encodeALL(UIComponent.java:1863) 
    javax.faces.component.UIComponent.encodeALL(UIComponent.java:1859) 
    javax.faces.component.UIComponent.encodeALL(UIComponent.java:1859) 
    com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:443) 
    com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131) 
    javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337) 
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120) 
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219) 
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:647) 
    org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) 
    org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    org.apache.catalina.core.StandardContextValve.invoke(StadnardContextValve.java:123) 
    org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45) 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
    org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041) 
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603) 
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    java.lang.Thread.run(Thread.java:744) 

Feb 10, 2014 4:40:29 PM org.apache.catalina.core.StandaardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [Faces Servlet] in context with hpath [/log4jTest] threw exception [null] with root cause 
java.lang.NullPointerExpression 
    javax.el.CompositeELResolver.invoke(CompositeELResolver.java:255) 
    javax.el.CompositeELResolver.invoke(CompositeELResolver.java:255) 
    org.apachee.el.parser.AstValue.getValue(AstValue.java:172) 
    org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:185) 
    com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.jaava:109) 
    javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194) 
    javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182) 
    javax.faces.component.UIOutput.getValue(UIOutput.java:174) 
    com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getValue(HtmlBasicInputRenderer.java:205) 
    com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getCurrentValue(HtmlBasicRenderer.java:355) 
    com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeEnd(HtmlBasicRenderer.java:164) 
    javax.faces.component.UIComponentBase.encodeEnd(UIComponent.java:924) 
    javax.faces.component.UIComponent.encodeALL(UIComponent.java:1863) 
    javax.faces.component.UIComponent.encodeALL(UIComponent.java:1859) 
    javax.faces.component.UIComponent.encodeALL(UIComponent.java:1859) 
    com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:443) 
    com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131) 
    javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337) 
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120) 
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219) 
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:647) 
    org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) 
    org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    org.apache.catalina.core.StandardContextValve.invoke(StadnardContextValve.java:123) 
    org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45) 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
    org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041) 
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603) 
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    java.lang.Thread.run(Thread.java:744) 

Итак, мне нужно несколько вещей: A- Чтобы устранить это исключение nullPointerException (я считаю, что это происходит из-за моего отсутствия знаний о Java EE и, следовательно, неправильного использования платформы. B- Информация о том, как я могу использовать Java EE правильно или неправильно, а также информацию/ресурсы, которые могут помочь мне улучшить. В основном исправления к этому простому приложению.

Бонус для меня. При написании этой справки я наткнулся на ответ на вопрос, связанный с настройкой ведения журнала. По-видимому, я получил его, чтобы работать сейчас, что хорошо, однако проблема выше сохраняется через мои настройки.

Спасибо за чтение, и я ценю любые советы, исправления и поддержку!

+0

метод ремонта 'общественного Строка setStatusMsg() {this.statusMsg = statusMsg; } '=> это должно быть' public void setStatusMsg (String statusMsg) {this.statusMsg = statusMsg; } ' –

+0

Я исправил это в сообщении, но именно так я и получил его в коде. Это было мое плохое разрешение опечатки, извините. – MarekVarro

+0

TomEE поставляется с MyFaces, но вы отправляете Mojarra через webapp. Они будут конфликтовать с «странными» исключениями. Избавьтесь от javax.faces.jar в webapp (это необходимо только при развертывании на сервере, у которого нет JSF-пакета, например Tomcat), полагаться на собственные MyEMaces Tomice и повторить попытку. – BalusC

ответ

0

Итак, если у вас есть <h:outputText value="#{logTest.foo()}"/> на своей странице, что процессор читает это:

  1. Существует, вероятно, переменная называется foo в этом управляемом компоненте
  2. Там будет метод, называемый getFoo() в том, что удалось bean, в соответствии с стандартами именования метода JavaBean.

Ваш класс не работает по обоим пунктам, следовательно, ошибка.


The <h:outputText/> ожидает значение связывания т.е. геттер для фактического атрибута класса, а не метод, который просто возвращает значение (без учета аргумента).Так что, как ожидается, это:

public class logTest { 

    private static final Logger LOGGER = Logger.getLogger(logTest.class); 

    private String statusMsg = "Default status"; 

    private String foo = "TheFoo" //There should be a named variable 

     public String getStatusMsg() { 
     return statusMsg; 
     } 

     public void setStatusMsg(String statusMsg) { 
     this.statusMsg = statusMsg; 
     } 

     public String getFoo(){ 
     LOGGER.info("Currently executing method getFoo()"); 
     return this.foo; 
     } 

     public String foo() { 
     LOGGER.info("Currently executing method foo()"); 
     setStatusmsg("Hello foo()!"); 
     return "foo() executed successfully!"; 
     } 
} 

Для получения дополнительной информации:

+0

Хотя это плохая практика, вы действительно должны иметь возможность вызывать методы выражения значений в EL-2.2 и выше, см. [Ответ BalusC] (http://stackoverflow.com/a/10202001/785663). Однако я не могу объяснить NPE. Может быть, сам класс 'logTest' не создается? – mabi

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