How to use FacesContext.getCurrentInstance (), it returns null

I struggled the last couple of days with the login part of my web application. I have reached such an extent that I can successfully authenticate a user using JDBCRealm on tomcat (reading users from a SQL Server database). Now I want to send some kind of feedback when the user account is locked or when the credentials are incorrect, this is where I am stuck right now.

I wanted to use this:

try { request.login(request.getParameter("user"), request.getParameter("pass")); } catch (ServletException se) { FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Wrong Username/Password combination")); log(se.getMessage()); } 

But FacesContext.getCurrentInstance () always returns null ..

After some research, it turned out that the request should come from a page located in / faces in order to call FacesServlet, and FacesContext gets initialized (at least what I understood).

So, I moved the login page to a new folder with the names of the faces inside the web pages folder. But now every time I try to call the login.xhtml page, I get this error:

 /login.xhtml Not Found in ExternalContext as a Resource 

And this is stacktrace:

 com.sun.faces.context.FacesFileNotFoundException: /login.xhtml Not Found in ExternalContext as a Resource at com.sun.faces.facelets.impl.DefaultFaceletFactory.resolveURL(DefaultFaceletFactory.java:232) at com.sun.faces.facelets.impl.DefaultFaceletFactory.resolveURL(DefaultFaceletFactory.java:273) at com.sun.faces.facelets.impl.DefaultFaceletFactory.getFacelet(DefaultFaceletFactory.java:201) at com.sun.faces.application.view.FaceletViewHandlingStrategy.buildView(FaceletViewHandlingStrategy.java:764) at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:100) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:410) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:304) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:619) 

I get this error even when I enter the URL directly into the browser.

Im using Netbeans 7.1 with Apache Tomcat 7 (which, by the way, is a pain because I get a lot of PermGen memory exceptions due to -.-)

Any help on how to fix this would be greatly appreciated.

+7
source share
1 answer

It will return null if you are not in a managed bean or any other JSF artifact. For example, a simple vanilla servo or a servlet filter that runs before FacesServlet . FacesServlet is someone who creates a FacesContext and places it as a ThreadLocal in the current HTTP request. You need to complete the login task in a JSF managed bean in the usual way. This piece of code that you have belongs to a JSF managed bean.

As for the login page, it is no different from any other JSF page you have ever developed. Or have you never really developed with JSF and is this your first attempt at JSF? Well, you should talk more about this in your question. Get rid of this /faces folder, just put login.xhtml directly in webcontent and make sure the FacesServlet URL pattern in web.xml set to *.xhtml . Then you can simply open it http: // localhost: 8080 / yourapp / login.xhtml .

To get to know JSF better, first check out a little decent book / tutorial, and don't try to fool the bits you found on the Internet and don't understand what these lines of code do. It is assumed that you will be able to write / explain it as soon as you understand it. Start here: Our JSF wiki page .

+8
source

All Articles