2015-03-04 8 views
0

Я получаю исключения нулевого указателя на следующую строку в моей DAO:Hibernate нулевой указатель исключение

Session session = sessionFactory.getCurrentSession(); 

Я не совсем уверен, почему, как я печатаю на консоли правильные значения с помощью сеанса/sessionFactory, но когда я пытаюсь вывести одни и те же значения в моем jsp, я получаю исключение null-указателя.

Моя конфигурация XML:

<?xml version="1.0" encoding="UTF-8"?> 
    <beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"` 
    xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation="http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.1.xsd 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd"> 

    <context:annotation-config></context:annotation-config> 
    <context:component-scan base-package="com.sga.app.dao"></context:component-scan> 
    <jee:jndi-lookup jndi-name="jdbc/springSgaDb" id="dataSource" 
     expected-type="javax.sql.DataSource"> 
    </jee:jndi-lookup> 

     <bean id="transactionManager" 
     class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
     <property name="dataSource" ref="dataSource"></property> 
     </bean> 

    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource"></property> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop> 
      </props> 
     </property> 
     <property name="packagesToScan"> 
      <list> 
       <value>com.sga.app.beans</value> 
       <value>com.sga.app.dao</value> 
      </list> 
     </property> 

     <property name="annotatedClasses"> 
      <array> 
       <value>com.sga.app.dao.DisplayStatsDAO</value> 
      </array> 
     </property> 
     <!-- --> 

    </bean> 

    <bean id="exceptionTranslator" 
     class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"> 
    </bean> 
    <tx:annotation-driven /> 
    </beans> 

Мой DAO:

package com.sga.app.dao; 

import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.List; 

import org.hibernate.Criteria; 
import org.hibernate.HibernateException; 
import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.criterion.Restrictions; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.security.core.Authentication; 
import org.springframework.security.core.context.SecurityContextHolder; 
import org.springframework.stereotype.Component; 
import org.springframework.stereotype.Repository; 
import org.springframework.transaction.annotation.Transactional; 

import com.sga.app.beans.UserBean; 

@SuppressWarnings("unchecked") 
@Component("displayStatsDAO") 
@Transactional 
@Repository 
@Configuration 
public class DisplayStatsDAO implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Autowired 
    private SessionFactory sessionFactory; 

    public void setSessionFactory(SessionFactory sessionFactory) { 
     this.sessionFactory = sessionFactory; 
    } 

    @Bean 
    public DisplayStatsDAO displayStatsDAO() { 
     return new DisplayStatsDAO(); 
    } 

    public DisplayStatsDAO() { 

    } 

    public String getLoggedInUserName(String username) { 
     Authentication authentication = SecurityContextHolder.getContext() 
       .getAuthentication(); 
     String userLoggedIn = authentication.getName(); 
     return userLoggedIn; 
    } 

    @Transactional 
    public ArrayList<Object> showMyStats() { 

     @SuppressWarnings("rawtypes") 
     ArrayList result = new ArrayList(); 
     try { 

      /* 
      * SessionFactory factory = (SessionFactory) new 
      * org.hibernate.cfg.Configuration 
      *().configure().buildSessionFactory(); Session sesh = 
      * factory.openSession(); sesh.beginTransaction(); 
      */ 

      Session session = sessionFactory.getCurrentSession(); 
      Authentication authentication = SecurityContextHolder.getContext() 
        .getAuthentication(); 
      String userLoggedIn = authentication.getName(); 
      System.out.println(userLoggedIn); 
      session.beginTransaction(); 
      Criteria criteria = session.createCriteria(UserBean.class); 
      criteria.add(Restrictions.like("username", userLoggedIn)); 
      List<UserBean> user = (List<UserBean>) criteria.list(); 
      // session.getTransaction().commit(); 
      for (UserBean userDetails : user) { 
       System.out.println("SHOW LOGGED-IN USER"); 
       System.out.println("Username: " + userDetails.getUsername()); 
       result.add(userDetails.getUsername()); 
       System.out.println("Name: " + userDetails.getForename() + "" 
         + userDetails.getSurname()); 
       result.add(userDetails.getForename()); 
       result.add(userDetails.getSurname()); 
       System.out.println("Homeclub: " + userDetails.getHomeclub()); 
       result.add(userDetails.getHomeclub()); 
       System.out.println("GIR: " + userDetails.getGir()); 
       result.add(userDetails.getGir()); 
       System.out 
         .println("Fairways: " + userDetails.getFairways_hit()); 
       result.add(userDetails.getFairways_hit()); 
       System.out.println("Putts: " + userDetails.getPutts()); 
       result.add(userDetails.getPutts()); 
       System.out.println("Score average: " 
         + userDetails.getScore_avg()); 
       result.add(userDetails.getScore_avg()); 
       System.out 
         .println("Sand saves: " + userDetails.getSand_saves()); 
       result.add(userDetails.getSand_saves()); 
       System.out.println(); 
       System.out.println(result.get(0).toString()); 
       System.out.println(result.get(3).toString());    
       return result; 
      } 
     } catch (HibernateException e) { 
      e.printStackTrace(); 
     } 
     return result; 
    } 
} 

Мой JSP:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
pageEncoding="ISO-8859-1"%> 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%> 
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form"%> 
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> 
<%@page import="com.sga.app.dao.DisplayStatsDAO" %> 
<%@page import="java.util.*"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<link href="${pageContext.request.contextPath}/static/css/main.css" 
    rel="stylesheet" type="text/css"> 
<title>SGA-user stats</title> 
</head> 
<body> 
    <!-- Logout option --> 
    <div id="logoutOptionDiv" align="right"> 
     <a id="logoutOption" style="color: blue;" 
      href='<c:url value="/j_spring_security_logout"></c:url>'>Logout</a> 
    </div> 
    <br /> 
    <!-- Page nav --> 
    <div> 
     <a style="font-weight: bold;" 
      href="${pageContext.request.contextPath}/menu">Main menu</a> <a 
      style="font-weight: bold; margin-left: 15px;" 
      href="${pageContext.request.contextPath}/roundanalysis">Round 
      analysis</a> 
    </div> 
    <br /> 
    <br /> 
    <h2 class="displayStatsLeaderboardHeader">Your stats</h2> 
    <table class="displayStatsTable" border="1"> 
     <tr> 
      <td>Username</td> 
      <td>Forename</td> 
      <td>Surname</td> 
      <td>Average Score</td> 
      <td>GIR (%)</td> 
      <td>Fairways hit (%)</td> 
      <td>Sand saves (%)</td> 
      <td>Putts per round</td> 
     </tr> 
    <%DisplayStatsDAO stats = new DisplayStatsDAO();%> 
     <tr> 
      <td class="displayStatsTableData"><%stats.showMyStats().get(0). 
       toString();%> 
      </td> 
      <td class="displayStatsTableData">${row.surname}</td> 
      <td class="displayStatsTableData">${row.average_score}</td> 
      <td class="displayStatsTableData">${row.gir}</td> 
      <td class="displayStatsTableData">${row.fairways_hit}</td> 
      <td class="displayStatsTableData">${row.sand_saves}</td> 
      <td class="displayStatsTableData">${row.putts}</td> 
     </tr> 
    </table> 
</body> 
</html> 
+0

какая версия весны вы работали? –

+0

@AbelRoussi Spring 4.1.4 Release – smoggers

+0

Я думаю, вы должны использовать ** org.springframework.orm.hibernate4.LocalSessionFactoryBean ** вместо ** org.springframework.orm.hibernate3.nnation.AnnotationSessionFactoryBean **, попробуйте и надейтесь, что это поможет вам –

ответ

0

Когда вы пишете new DisplayStatsDAO() в вашей JSP, он инициализируется за пределами Spring контекст контейнера. Весна не имеет возможности вводить сессию в DAO.

+0

Я вижу, что имеет смысл, мне нужно будет искать другой способ вывода данных в jsp, поэтому – smoggers

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