javax.naming.NameNotFoundException:名称[SessionFactory]在此上下文中未绑定。找不到[SessionFactory]
我正在尝试在我的Spring应用程序中使用Hibernate进行Db访问。但现在,我得到了以下错误:javax.naming.NameNotFoundException:名称[SessionFactory]在此上下文中未绑定。找不到[SessionFactory],java,spring,hibernate,Java,Spring,Hibernate,我正在尝试在我的Spring应用程序中使用Hibernate进行Db访问。但现在,我得到了以下错误: Could not locate SessionFactory in JNDI javax.naming.NameNotFoundException: Name [SessionFactory] is not bound in this Context. Unable to find [SessionFactory]. at org.apache.naming.NamingContext
Could not locate SessionFactory in JNDI
javax.naming.NameNotFoundException: Name [SessionFactory] is not bound in this Context. Unable to find [SessionFactory].
at org.apache.naming.NamingContext.lookup(NamingContext.java:820)
at org.apache.naming.NamingContext.lookup(NamingContext.java:168)
at org.apache.naming.SelectorContext.lookup(SelectorContext.java:158)
at javax.naming.InitialContext.lookup(InitialContext.java:411)
at org.ligadesportiva.data.UsuarioHome.getSessionFactory(UsuarioHome.java:28)
at org.ligadesportiva.data.UsuarioHome.<init>(UsuarioHome.java:23)
at org.ligadesportiva.controller.controller.login(controller.java:36)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:440)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:428)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
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:502)
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:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
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(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
正在通过以下方式从我的控制器调用此方法:
@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ã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;
}
}
并将此行添加到我的类主页(DAO类):
我不知道我所做的是否正确,但错误消息更改为:
您的错误是由
(SessionFactory)new InitialContext()引起的。查找(“SessionFactory”)
。由于您使用的是spring框架,我建议您使用IoC方法,而不是使用InitialContext
要使用SessionFactory,您需要使用几个属性初始化该类,例如dataSource、hibernateProperties、entities等。。通常使用XML或注释驱动的方法来完成。您可以配置SessionFactory并让它存在于IoC容器中,然后将其注入到您的主类中
上面的链接显示了这两种方法(XML和注释)。尝试跟踪它并设置bean=D
更新:这个mkyong的教程包含了一步一步的教程,非常清晰 我在我的项目中做了一个更改,尝试按照您指示我的第一个链接的方向进行操作,事实上,我收到了一条新的错误消息。你能看看我的更新,看看我现在做错了什么吗?如果有任何帮助,我将不胜感激。您能给我看看您的spring-servlet.xml吗?您应该在UsuarioHome类中执行@Autowired SessionFactory SessionFactory。这是我的spring(?)-servlet.xml(您是指ligadesportiva-servlet.xml,对吗?它是web.xml文件中的servlet名称)->。我把@Autowired也放在了我的家庭课上。表示需要将context:annotation-config标记添加到*servlet.xml。试一试?它可以停止上面的NullPointerException,但现在我出现了以下错误:
@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ã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;
}
}
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;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
Properties hibernateProperties() {
return new Properties() {
{
setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
setProperty("hibernate.dialect", env.getProperty("hibernate.dialect"));
}
};
}
}
private HibernateConfig hibernateConfig = new HibernateConfig();
private final SessionFactory sessionFactory = (SessionFactory) hibernateConfig.sessionFactory();