Je fais un Java webapp avec Spring et Hibernate, mais quand je l'exécute, je cette erreur:java.lang.NullPointerException en raison de sessionFactory.getCurrentSession()
SEVERE: El Servlet.service() para el servlet [springapp] en el contexto con ruta [/appCracks] lanzó la excepción [Request processing failed; nested exception is java.lang.NullPointerException] con causa raíz
java.lang.NullPointerException
at com.companyname.springapp.repository.UsuarioDaoImp.getTodosUsuariosList(UsuarioDaoImp.java:26)
at com.companyname.springapp.service.SimpleAnonimoManager.identificarse(SimpleAnonimoManager.java:21)
at com.companyname.springapp.web.IdentificarseFormController.onSubmit(IdentificarseFormController.java:46)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:174)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:421)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:409)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:771)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:716)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
L'erreur est dans ce ligne, lorsque je tente d'obtenir la session:
return this.sessionFactory.getCurrentSession().createQuery("from Usuario u order by u.id").list();
je copie ici, les classes impliquées dans cette erreur:
UsuarioDaoImp.java
package com.companyname.springapp.repository;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.hibernate.SessionFactory;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import com.companyname.springapp.domain.Usuario;
@Repository(value = "usuarioDao")
public class UsuarioDaoImp implements UsuarioDao {
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
@Override
@SuppressWarnings("unchecked")
public List<Usuario> getTodosUsuariosList() {
return this.sessionFactory.getCurrentSession()
.createQuery("from Usuario u order by u.id")
.list();
}
@Override
public String encriptarContrasena(String contrasena) {
return (String) this.sessionFactory.getCurrentSession()
.createQuery("select SHA1(:c)")
.setParameter ("c", contrasena)
.uniqueResult();
}
@Override
public String getTipoUsuario(String usuario) {
return (String) this.sessionFactory.getCurrentSession()
.createQuery("select u.tipoUsuario from Usuario u where u.usuario = '" +
usuario + "'")
.uniqueResult();
}
}
SimpleAnonimoManager.java:
package com.companyname.springapp.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.companyname.springapp.domain.Usuario;
import com.companyname.springapp.repository.UsuarioDao;
@Component
public class SimpleAnonimoManager implements AnonimoManager {
private static final long serialVersionUID = 1L;
@Autowired
private UsuarioDao usuarioDao;
@Override
public boolean identificarse(String nombreUsuario, String contrasena) {
List<Usuario> usuarios = usuarioDao.getTodosUsuariosList();
if (usuarios != null) {
for (Usuario usuario : usuarios) {
if (usuario.getUsuario().equals(nombreUsuario)) {
if (usuario.getContrasena().equals(usuarioDao.encriptarContrasena(contrasena))) {
return true;
}
else {
return false;
}
}
}
}
return false;
}
@Override
public String getTipoUsuario(String usuario) {
return usuarioDao.getTipoUsuario(usuario);
}
}
IdentificarseFormController.java:
package com.companyname.springapp.web;
import java.util.Calendar;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.RedirectView;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import com.companyname.springapp.service.AdminManager;
import com.companyname.springapp.service.GmcracksManager;
import com.companyname.springapp.service.Identificarse;
import com.companyname.springapp.service.AnonimoManager;
@Controller
@RequestMapping(value="/identificarse.htm")
public class IdentificarseFormController {
@Autowired
private AnonimoManager anonimoManager;
@RequestMapping(method = RequestMethod.POST)
public ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, @Valid Identificarse identificarse, BindingResult result) {
String usuario = identificarse.getUsuario();
String contrasena = identificarse.getContrasena();
boolean IdentificacionOK = anonimoManager.identificarse(usuario, contrasena);
if (IdentificacionOK) {
request.getSession().setAttribute("nombreUsuario", usuario);
String tipoUsuario = anonimoManager.getTipoUsuario(usuario);
request.getSession().setAttribute("tipoUsuario", tipoUsuario);
return new ModelAndView (new RedirectView("hello.htm"));
}
else {
request.getSession().setAttribute("error", "Usuario o contraseña incorrectos");
return new ModelAndView (new RedirectView ("identificarse.htm"));
}
}
@RequestMapping(method = RequestMethod.GET)
protected Identificarse formBackingObject(HttpServletRequest request) throws ServletException {
Identificarse identificarse = new Identificarse();
return identificarse;
}
Les fichiers de configuration sont ceci: app-config.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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
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">
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="messages"/>
</bean>
<!-- Scans the classpath of this application for @Components to deploy as beans -->
<context:component-scan base-package="com.companyname.springapp.web" />
<!-- Configures the @Controller programming model -->
<mvc:annotation-driven/>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
<property name="prefix" value="/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
applicationContext.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:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- holding properties for database connectivity /-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- enabling annotation driven configuration /-->
<context:annotation-config/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
<property name="configurationClass">
<value>org.hibernate.cfg.AnnotationConfiguration</value>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- Scans the classpath of this application for @Components to deploy as beans -->
<context:component-scan base-package="com.companyname.springapp.repository" />
<context:component-scan base-package="com.companyname.springapp.service" />
</beans>
hibernate.cfg.xml:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<mapping class="com.companyname.springapp.repository.UsuarioDaoImp" />
</session-factory>
</hibernate-configuration>
J'essaie aussi de cartographier la classe Usuario.java qui est l'entité dans la base de données, mais j'ai le même problème.
Le problème est lorsque j'essaie d'obtenir la session. On m'a dit d'utiliser OpenSessionInViewFilter, et d'utiliser SessionFactoryUtil au lieu de SessionFactory, mais je ne sais pas comment l'utiliser.
Quelqu'un peut-il m'aider? Merci
Ok. Merci. Cela fonctionne maintenant. Mais j'ai un doute. Avant, j'ai l'application faite avec EntityManager au lieu de SessionFactory, et j'ai beaucoup de problèmes de mémoire, et il baisse tous les jours en raison de java.lang.OutOfMemoryError: espace de tas Java. J'ai demandé et m'a dit que le problème était dû à EntityManager, et je devrais utiliser SessionFactory, mais je ne sais pas si je l'utilise bien. Avec ce que j'ai fait maintenant, savez-vous si j'aurai ce problème? –
C'est difficile à dire! Si vous utilisez Hibernate, vous pouvez utiliser SessionFactory. –