本文介绍了异常java.lang.NullPointerException何时需要在Spring / Hibernate项目中访问数据库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Spring应用程序中尝试使用Hibernate进行Db访问。在依赖关系(现在已解决)出现一些问题后,我可以正常运行我的项目,并且它的第一页向我打开(这是一个登录页面)。但是,当我将表单提交给服务器时(此请购单由一个弹簧控制器处理),我收到以下错误消息:

  org.springframework.web.util.NestedServletException:请求处理失败;嵌套的例外是显示java.lang.NullPointerException 
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:948)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java: 838)
javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
javax。 servlet.http.HttpServlet.service(HttpServlet.java:728)
根本原因

java.lang.NullPointerException
org.ligadesportiva.resources.HibernateConfig.restDataSource(HibernateConfig.java :38)
org.ligadesportiva.resources.HibernateConfig.sessionFactory(HibernateConfig.java:28)
org.ligadesportiva.data.UsuarioHome。< init>(UsuarioHome.java:31)
org.ligadesportiva.controller.controller.login(controller.java:36)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(N ativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
组织。 springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:440)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:428)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
组织。 springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
org.springframework.web.servlet。 FrameworkServlet.doPost(FrameworkServlet.java:838)
javax。 servlet.http.HttpServlet.service(HttpServlet.java:647)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
javax.servlet.http.HttpServlet.service( HttpServlet.java:728)

这是处理请求的控制器的方法:

  @RequestMapping(value =/ login,method = RequestMethod.POST)
public ModelAndView login(@RequestParam(username )字符串用户名,@RequestParam(password)字符串密码)抛出NoSuchAlgorithmException
{
MessageDigest md = MessageDigest.getInstance(MD5);
md.update(password.getBytes());
byte [] digest = md.digest();

Usuario temp = new Usuario(username,convertByteToHex(digest));
UsuarioHome tempHome = new UsuarioHome();
列出< Usuario> lista = tempHome.findByExample(temp);
if(lista.size()== 0){
ModelAndView mav = new ModelAndView();
mav.setViewName(usuario_login);
mav.addObject(message,N& atilde; o foi possivel efetuar o login);
return mav;
}
else {
this.sessao = new Sessao();
ModelAndView mav = new ModelAndView();
mav.setViewName(usuario_start);
mav.addObject(usuario,temp);
return mav;


这是我的HibernateConfig类:

  package org.ligadesportiva.resources; 

import java.util.Properties;
import javax.sql.DataSource;
import org.apache.tomcat.dbcp.dbcp.BasicDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
import org.springframework.orm.hibernate3.HibernateTransactionManager;
import org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
$ b @Configuration
@EnableTransactionManagement
@PropertySource({classpath:database.properties})
@ComponentScan({org.ligadesportiva.data})
public class HibernateConfig {

@Autowired
private环境env;

@Bean
public AnnotationSessionFactoryBean sessionFactory(){
AnnotationSessionFactoryBean sessionFactory = new AnnotationSessionFactoryBean();
sessionFactory.setDataSource(restDataSource());
sessionFactory.setPackagesToScan(new String [] {org.ligadesportiva.core});
sessionFactory.setHibernateProperties(hibernateProperties());

return sessionFactory;


@Bean
public DataSource restDataSource(){
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(env.getProperty(jdbc.driverClassName));
dataSource.setUrl(env.getProperty(jdbc.url));
dataSource.setUsername(env.getProperty(jdbc.user));
dataSource.setPassword(env.getProperty(jdbc.pass));

返回dataSource;


$Be
public HibernateTransactionManager transactionManager(){
HibernateTransactionManager txManager = new HibernateTransactionManager();
txManager.setSessionFactory(sessionFactory()。getObject());

返回txManager;

$ b @SuppressWarnings(serial)
属性hibernateProperties(){
返回新属性(){
{
setProperty hibernate.hbm2ddl.auto,env.getProperty(hibernate.hbm2ddl.auto));
setProperty(hibernate.show_sql,env.getProperty(hibernate.show_sql));
setProperty(hibernate.dialect,env.getProperty(hibernate.dialect));
}
};




$ b这是我的DAO类(UsuarioHome.java):

  package org.ligadesportiva.data; 

//由Hibernate Tools生成15/03/2014 09:34:19 3.4.0.CR1

import java.util.List;
import javax.naming.InitialContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.LockMode;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Example;
import org.ligadesportiva.core.Usuario;

/ **
*域模型类的主对象Usuario。
* @see org.ligadesportiva.core.Usuario
* @author Hibernate Tools
* /
public class UsuarioHome {

private static final Log log = LogFactory.getLog(UsuarioHome.class);

private HibernateConfig hibernateConfig = new HibernateConfig();

@Autowired
private final SessionFactory sessionFactory =(SessionFactory)hibernateConfig.sessionFactory();

public void persist(Usuario transientInstance){
log.debug(persisting Usuario instance);
尝试{
sessionFactory.getCurrentSession()。persist(transientInstance);
log.debug(坚持成功);
} catch(RuntimeException re){
log.error(persist failed,re);
throw re;


$ b public void attachDirty(Usuario instance){
log.debug(attached dirty Usuario instance);
尝试{
sessionFactory.getCurrentSession()。saveOrUpdate(instance);
log.debug(attach成功);
} catch(RuntimeException re){
log.error(attach failed,re);
throw re;


$ b $ public void attachClean(Usuario instance){
log.debug(attached clean Usuario instance);
尝试{
sessionFactory.getCurrentSession()。lock(instance,LockMode.NONE);
log.debug(attach成功);
} catch(RuntimeException re){
log.error(attach failed,re);
throw re;


$ b $ public void delete(Usuario persistentInstance){
log.debug(Delete Usuario instance);
尝试{
sessionFactory.getCurrentSession()。delete(persistentInstance);
log.debug(删除成功);
} catch(RuntimeException re){
log.error(delete failed,re);
throw re;


$ b公共Usuario合并(Usuario detachedInstance){
log.debug(合并Usuario实例);
尝试{
Usuario result =(Usuario)sessionFactory.getCurrentSession()
.merge(detachedInstance);
log.debug(merge successful);
返回结果;
} catch(RuntimeException re){
log.error(merge failed,re);
throw re;


$ b $ public Usuario findById(int id){
log.debug(将Usuario实例加入id:+ id);
try {
Usuario instance =(Usuario)sessionFactory.getCurrentSession()
.get(org.ligadesportiva.data.Usuario,id);
if(instance == null){
log.debug(get successful,no instance found);
} else {
log.debug(get successful,instance found);
}
返回实例;
} catch(RuntimeException re){
log.error(get failed,re);
throw re;


$ b $ public List findByExample(Usuario instance){
log.debug(通过示例查找Usuario实例);
尝试{
List results = sessionFactory.getCurrentSession()
.createCriteria(org.ligadesportiva.data.Usuario)
.add(Example.create(instance))。名单();
log.debug(成功查找成功,结果大小:
+ results.size());
返回结果;
} catch(RuntimeException re){
log.error(find by example failed,re);
throw re;
}
}
}

这是我* servlet.xml文件,我在这里声明HibernateConfig,遵循以下指令:。

 <?xml version =1.0encoding =UTF-8?> 
< beans xmlns =http://www.springframework.org/schema/beansxmlns:xsi =http://www.w3.org/2001/XMLSchema-instancexmlns:p = http://www.springframework.org/schema/pxmlns:context =http://www.springframework.org/schema/contextxsi:schemaLocation =http://www.springframework.org/schema/豆类http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring -context-3.0.xsd>
< context:component-scan base-package =org.ligadesportiva.controller/>
< bean id =viewResolverclass =org.springframework.web.servlet.view.UrlBasedViewResolver>
< property name =viewClassvalue =org.springframework.web.servlet.view.JstlView/>
< property name =prefixvalue =/ WEB-INF / jsp //>
< property name =suffixvalue =。jsp/>
< / bean>

< context:annotation-config />
< bean class =org.ligadesportiva.resources.HibernateConfig/>
< / beans>

有人可以看到这段代码有什么问题吗?



您的 HibernateConfig 类用 @Configuration 注释。这表明它应该由管理,这是您在上下文文件中正确执行的操作。

 < bean class =org.ligadesportiva.resources.HibernateConfig/> 

但是,您并未在任何地方使用它。你还没有声明 UsuarioHome bean。相反,你自己创建这些对象

  UsuarioHome tempHome = new UsuarioHome(); 
//和
private HibernateConfig hibernateConfig = new HibernateConfig();

您如何期望Spring处理它们?

浏览了解如何通过您的上下文配置管理这些依赖项。


I am trying use Hibernate for Db access in my Spring app. After some problems with dependencies (now solved), I can run my project normally, and the first page of it open to me (it's a login page). But, when I submit the form to server (this requisition is handled by a spring controller), I receive the follow error message:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:948)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
root cause

java.lang.NullPointerException
    org.ligadesportiva.resources.HibernateConfig.restDataSource(HibernateConfig.java:38)
    org.ligadesportiva.resources.HibernateConfig.sessionFactory(HibernateConfig.java:28)
    org.ligadesportiva.data.UsuarioHome.<init>(UsuarioHome.java:31)
    org.ligadesportiva.controller.controller.login(controller.java:36)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:606)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:440)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:428)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

This is the method from controller which handle the requisition:

@RequestMapping(value="/login", method=RequestMethod.POST)
    public ModelAndView login(@RequestParam("username") String username, @RequestParam("password") String password) throws NoSuchAlgorithmException
    {
        MessageDigest md = MessageDigest.getInstance("MD5");
        md.update(password.getBytes());
        byte[] digest = md.digest();

        Usuario temp = new Usuario(username, convertByteToHex(digest));
        UsuarioHome tempHome = new UsuarioHome();
        List<Usuario> lista = tempHome.findByExample(temp);
        if(lista.size() == 0) {
            ModelAndView mav = new ModelAndView();
            mav.setViewName("usuario_login");
            mav.addObject("message", "N&atilde;o foi possivel efetuar o login");
            return mav;
        }
        else {
            this.sessao = new Sessao();
            ModelAndView mav = new ModelAndView();
            mav.setViewName("usuario_start");
            mav.addObject("usuario", temp);
            return mav;
        }
    }

This is my class HibernateConfig:

package org.ligadesportiva.resources;

import java.util.Properties;
import javax.sql.DataSource;
import org.apache.tomcat.dbcp.dbcp.BasicDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
import org.springframework.orm.hibernate3.HibernateTransactionManager;
import org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableTransactionManagement
@PropertySource({ "classpath:database.properties" })
@ComponentScan({ "org.ligadesportiva.data" })
public class HibernateConfig {

   @Autowired
   private Environment env;

   @Bean
   public AnnotationSessionFactoryBean sessionFactory() {
      AnnotationSessionFactoryBean sessionFactory = new AnnotationSessionFactoryBean();
      sessionFactory.setDataSource(restDataSource());
      sessionFactory.setPackagesToScan(new String[] { "org.ligadesportiva.core" });
      sessionFactory.setHibernateProperties(hibernateProperties());

      return sessionFactory;
   }

   @Bean
   public DataSource restDataSource() {
      BasicDataSource dataSource = new BasicDataSource();
      dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
      dataSource.setUrl(env.getProperty("jdbc.url"));
      dataSource.setUsername(env.getProperty("jdbc.user"));
      dataSource.setPassword(env.getProperty("jdbc.pass"));

      return dataSource;
   }

   @Bean
   public HibernateTransactionManager transactionManager() {
      HibernateTransactionManager txManager = new HibernateTransactionManager();
      txManager.setSessionFactory(sessionFactory().getObject());

      return txManager;
   }

   @SuppressWarnings("serial")
   Properties hibernateProperties() {
      return new Properties() {
         {
            setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
            setProperty("hibernate.show_sql", env.getProperty("hibernate.show_sql"));
            setProperty("hibernate.dialect", env.getProperty("hibernate.dialect"));
         }
      };
   }
}

This is my class DAO (UsuarioHome.java):

package org.ligadesportiva.data;

// Generated 15/03/2014 09:34:19 by Hibernate Tools 3.4.0.CR1

import java.util.List;
import javax.naming.InitialContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.LockMode;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Example;
import org.ligadesportiva.core.Usuario;

/**
 * Home object for domain model class Usuario.
 * @see org.ligadesportiva.core.Usuario
 * @author Hibernate Tools
 */
public class UsuarioHome {

    private static final Log log = LogFactory.getLog(UsuarioHome.class);

    private HibernateConfig hibernateConfig = new HibernateConfig();

@Autowired
private final SessionFactory sessionFactory = (SessionFactory) hibernateConfig.sessionFactory();

    public void persist(Usuario transientInstance) {
        log.debug("persisting Usuario instance");
        try {
            sessionFactory.getCurrentSession().persist(transientInstance);
            log.debug("persist successful");
        } catch (RuntimeException re) {
            log.error("persist failed", re);
            throw re;
        }
    }

    public void attachDirty(Usuario instance) {
        log.debug("attaching dirty Usuario instance");
        try {
            sessionFactory.getCurrentSession().saveOrUpdate(instance);
            log.debug("attach successful");
        } catch (RuntimeException re) {
            log.error("attach failed", re);
            throw re;
        }
    }

    public void attachClean(Usuario instance) {
        log.debug("attaching clean Usuario instance");
        try {
            sessionFactory.getCurrentSession().lock(instance, LockMode.NONE);
            log.debug("attach successful");
        } catch (RuntimeException re) {
            log.error("attach failed", re);
            throw re;
        }
    }

    public void delete(Usuario persistentInstance) {
        log.debug("deleting Usuario instance");
        try {
            sessionFactory.getCurrentSession().delete(persistentInstance);
            log.debug("delete successful");
        } catch (RuntimeException re) {
            log.error("delete failed", re);
            throw re;
        }
    }

    public Usuario merge(Usuario detachedInstance) {
        log.debug("merging Usuario instance");
        try {
            Usuario result = (Usuario) sessionFactory.getCurrentSession()
                    .merge(detachedInstance);
            log.debug("merge successful");
            return result;
        } catch (RuntimeException re) {
            log.error("merge failed", re);
            throw re;
        }
    }

    public Usuario findById(int id) {
        log.debug("getting Usuario instance with id: " + id);
        try {
            Usuario instance = (Usuario) sessionFactory.getCurrentSession()
                    .get("org.ligadesportiva.data.Usuario", id);
            if (instance == null) {
                log.debug("get successful, no instance found");
            } else {
                log.debug("get successful, instance found");
            }
            return instance;
        } catch (RuntimeException re) {
            log.error("get failed", re);
            throw re;
        }
    }

    public List findByExample(Usuario instance) {
        log.debug("finding Usuario instance by example");
        try {
            List results = sessionFactory.getCurrentSession()
                    .createCriteria("org.ligadesportiva.data.Usuario")
                    .add(Example.create(instance)).list();
            log.debug("find by example successful, result size: "
                    + results.size());
            return results;
        } catch (RuntimeException re) {
            log.error("find by example failed", re);
            throw re;
        }
    }
}

And this is my *-servlet.xml file, where I declare the HibernateConfig, following instruction from here: http://docs.spring.io/spring/docs/3.1.x/javadoc-api/org/springframework/context/annotation/Configuration.html.

<?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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    <context:component-scan base-package="org.ligadesportiva.controller" />
    <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>    

    <context:annotation-config/>
    <bean class="org.ligadesportiva.resources.HibernateConfig"/>
</beans>

Someone can see what the problem with this code?

解决方案

The cardinal rule of Spring IoC container is to let Spring manage most, if not all, of your dependencies and objects.

Your HibernateConfig class is annotated with @Configuration. This is an indication that it should be managed by Spring, which you are doing correctly in your context file

<bean class="org.ligadesportiva.resources.HibernateConfig"/>

however, you're not using it anywhere. You're also not declaring a UsuarioHome bean. Instead, you are creating these objects yourself

UsuarioHome tempHome = new UsuarioHome();
// and
private HibernateConfig hibernateConfig = new HibernateConfig();

How do you expect Spring to process them?

Go through the documentation of Spring IoC container to understand how to manage these dependencies through your context configuration.

这篇关于异常java.lang.NullPointerException何时需要在Spring / Hibernate项目中访问数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-27 17:22