samual
samual

Reputation: 3

getCurrentSession NullPointerException

Stacktrace:

java.lang.NullPointerException
at de.mail.HibernateUtil.getSession(HibernateUtil.java:30)
at de.mail.gui.LoginServlet.doPost(LoginServlet.java:55)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
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:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)

HibernateUtil:

public abstract class HibernateUtil extends HttpServlet{

private static final long serialVersionUID = -1850678939342717642L;

@Autowired
private SessionFactory sessionFactory;

/**
 * Gibt die derzeitige Session zurück
 * 
 * @return derzeitige Session
 * @throws HibernateException
 */
public Session getSession() {
    return sessionFactory.getCurrentSession();
}
}

LoginServlet:

@Component
public class LoginServlet extends HibernateUtil {

/**
 * 
 */
private static final long serialVersionUID = -776218596462464850L;
private static final Log LOG = LogFactory.getLog(LoginServlet.class);
private static final int HEX_FF = 0xFF;

/**
 * Bearbeitet den Loginversuch<br />
 * Es werden die eingegebenen Daten ausgelesen. Aus dem Passwort wird ein Hash-Wert generiert, der mit dem Datenbankeintrag mit dem
 * passenden Usernamen verglichen wird. Stimmt alles &uumlberein wird auf die main.jsp weitergeleitet. Im Fehlerfall wird zur&uumlck auf
 * die login.jsp verwiesen.
 * 
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 * @param response der HttpResponse
 * @param request der HttpRequest
 * @throws ServletException ex
 * @throws IOException ex
 */
@Override
@Transactional
protected void doPost(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {

    if (!"Registrieren".equals(request.getParameter("register"))) {

        final Session session = getSession();

        // Generiert einen HashWert aus dem eingegebenen Passwort
        try {
            final byte[] pwBytes = request.getParameter("password").getBytes();
            final MessageDigest algorithm = MessageDigest.getInstance("MD5");
            algorithm.reset();
            algorithm.update(pwBytes);
            final byte[] messageDigest = algorithm.digest();

            final StringBuffer hexString = new StringBuffer();

            for (byte digest : messageDigest) {
                hexString.append(Integer.toHexString(HEX_FF & digest));
            }

            final LoginDAO dao = new LoginDAO();
            final List<UserVO> list = dao.checkLogin(request, session);

            final UserVO userVO = list.get(0);

            if (userVO.getPassword().equals(hexString.toString())) {

                request.getSession().setAttribute("userid", userVO.getId());
                final RequestDispatcher dispatcher = request.getRequestDispatcher("main.jsp");
                dispatcher.forward(request, response);

            } else {

                final RequestDispatcher dispatcher = request.getRequestDispatcher("login.jsp");
                dispatcher.forward(request, response);
            }

        } catch (NoSuchAlgorithmException nsax) {
            LOG.debug("Keine MessageDigestSpi fuer den entsprechenden Alogrithmus gefunden");

        } catch (NullPointerException npx) {
            final RequestDispatcher dispatcher = request.getRequestDispatcher("login.jsp");
            dispatcher.forward(request, response);

        } catch (IndexOutOfBoundsException ioobx) {
            final RequestDispatcher dispatcher = request.getRequestDispatcher("login.jsp");
            dispatcher.forward(request, response);
        }
    } else {
        final RequestDispatcher dispatcher = request.getRequestDispatcher("register.jsp");
        dispatcher.forward(request, response);
    }
}

/**
 * Tut nix besonders. Leiet an die doPost-Methode weiter
 * 
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 * @param response der HttpResponse
 * @param request der HttpRequest
 * @throws ServletException ex
 * @throws IOException ex
 */
@Override
protected void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
    doPost(request, response);
}
}

context.xml with hibernate implementations:

<!-- Component Scans -->
<context:component-scan base-package="de.mail"></context:component-scan>
<!-- Datenbank -->

<bean id="c3p0DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
    <property name="driverClass" value="org.postgresql.Driver" />
    <property name="jdbcUrl" value="something" />
    <property name="maxPoolSize" value="1" />
    <property name="properties">
        <props>
            <prop key="user">postgres</prop>
            <prop key="password">***</prop>
            <prop key="characterEncoding">UTF-8</prop>
            <!-- Properties sind nur notwendig, wenn man mal SSL für die DB-Verbindung 
            braucht (auch in der properties entkommentieren) -->
            <!-- <prop key="ssl">${db.ssl}</prop> <prop key="sslfactory">${db.sslfactory}</prop> -->
        </props>
    </property>
</bean>

<alias name="c3p0DataSource" alias="dataSource" />

<tx:annotation-driven transaction-manager="transactionManager"/>

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
    <property name="nestedTransactionAllowed" value="true" />
</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" destroy-method="destroy">
    <property name="dataSource" ref="dataSource" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
            <prop key="hibernate.current_session_context_class">thread</prop>
            <prop key="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>                
        </props>
    </property>     
    <property name="annotatedPackages">
      <list>
        <value>de.mail</value>
        <value>de.mail.data.dao</value>
        <value>de.mail.vo</value>
        <value>de.mail.gui</value>
      </list>
    </property>
    <property name="annotatedClasses">        
      <list>
        <value>de.mail.data.vo.UserVO</value>
        <value>de.mail.data.vo.FilterVO</value>
        <value>de.mail.data.vo.ResultVO</value>
        <value>de.mail.data.dao.ActionDAO</value>
        <value>de.mail.HibernateUtil</value>
        <value>de.mail.FilterJob</value>
        <value>de.mail.gui.ActionServlet</value>
        <value>de.mail.gui.CreateServlet</value>
        <value>de.mail.gui.DeleteServlet</value>
        <value>de.mail.gui.EditServlet</value>
        <value>de.mail.gui.FormServlet</value>
        <value>de.mail.gui.InitServlet</value>
        <value>de.mail.gui.LoginServlet</value>
        <value>de.mail.gui.LogoutServlet</value>
        <value>de.mail.gui.RegistrationServlet</value>
      </list>
    </property>

</bean>

Thanks for your answers so far! I really appriciate them.

I edited the post and added the updated classes. I still get the NullPointerException... I really don't get it. What am I missing here?

I think I found my problem, but now I am facing a new one: The attribute propagation is undefined for the annotation type Transactional

How can I fix this? --> Fixed: I imported the wrong package! Had to import org.springframework.transaction.annotation.Propagation

Now I am getting the NullPointerException again. My guess is, that SessionFactory == null. But why?

Upvotes: 0

Views: 1485

Answers (4)

samual
samual

Reputation: 3

Due to several problems I decided to revamp the whole project so the question here can be closed. Thanks for all the answers, they were helping me alot!

Upvotes: 0

riddle_me_this
riddle_me_this

Reputation: 9155

Might be dumb, but did you make sure to add the classes to the component-scan directive so that the annotations are picked up?

<context:component-scan base-package="de.mail.data.vo,com.blah" />

Upvotes: 0

Naveen Kumar
Naveen Kumar

Reputation: 973

Make the HibernateUtil's staticFactory and getSession are non-static members;@Autowire could not be applicable to static fields.

The HibernateUtil is not an Spring bean; Hence your @Autowire annotation on sessionFactory field will not be proceeded.

Either you configure HibernateUtil as spring bean in you context.xml or annotate the class with @Component, @Service or @Repository annotations (which one is appropriate...). If you using annotations, then make sure you are enabling component-scan in you context.xml to appropriate package. With this now your HibernateUtil will be an spring bean and ready to be injected to its depended.

In you LoginServlet, make the HibernateUtil as field and annotate with @Autowire. In LoginServlet's init method add the below code so spring will take care of injecting the hibernateutil to login servlet.

SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext (this);

Upvotes: 0

Andres
Andres

Reputation: 10725

@Autowired
private static SessionFactory sessionFactory;

Check this. You can not autowire static fields in Spring

Upvotes: 3

Related Questions