2014-11-25 5 views
1

В моем текущем проекте загрузки Spring, когда я пытаюсь выполнить запрос в базе данных, используя этот метод из моего класса dao (это уникальный, который я использовал в этом этап развития):«Нет CurrentSessionContext настроен», когда приложение пытается выполнить запрос в базе данных

public class Dao<E extends Model> { 

    @Autowired 
    private SessionFactory sessionFactory; 

    ... 

    @Transactional 
    public E findByField(String field, String value) { 
     return (E) sessionFactory.getCurrentSession().createQuery("from "+clazz.getSimpleName()+" where "+field+" = :data").setParameter("data", value).uniqueResult(); 
    } 
} 

Я получаю эту ошибку:

org.springframework.security.authentication.InternalAuthenticationServiceException: No CurrentSessionContext configured! 
     at org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser(DaoAuthenticationProvider.java:110) 
     at org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate(AbstractUserDetailsAuthenticationProvider.java:132) 
     at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:156) 
     at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:177) 
     at org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter.attemptAuthentication(UsernamePasswordAuthenticationFilter.java:94) 
     at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:211) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
     at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
     at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:57) 
     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
     at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
     at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50) 
     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
     at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192) 
     at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 
     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421) 
     at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070) 
     at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) 
     at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1736) 
     at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1695) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
     at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
     at java.lang.Thread.run(Thread.java:745) 
Caused by: org.hibernate.HibernateException: No CurrentSessionContext configured! 
     at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1012) 
     at org.store.generic.persistence.Dao.findByField(Dao.java:47) 
     at org.store.generic.persistence.Dao$$FastClassBySpringCGLIB$$ac46d9f5.invoke(<generated>) 
     at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
     at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:708) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
     at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98) 
     at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262) 
     at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
     at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:644) 
     at org.store.model.usuario.UsuarioDao$$EnhancerBySpringCGLIB$$426a101d.findByField(<generated>) 
     at org.store.security.AcessoService.loadUserByUsername(AcessoService.java:30) 
     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.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
     at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98) 
     at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262) 
     at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
     at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) 
     at com.sun.proxy.$Proxy64.loadUserByUsername(Unknown Source) 
     at org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser(DaoAuthenticationProvider.java:102) 
     ... 35 common frames omitted 

этот метод вызывается из этого класса обслуживания:

@Component 
public class AcessoService implements UserDetailsService { 

    @Autowired 
    private UsuarioDao usuario; 

    @Override 
    @Transactional 
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 
     Usuario account = (Usuario) usuario.findByField("login", username); 

    if(account==null) 
     throw new UsernameNotFoundException("No such user: " + username); 
    else if (account.getRole().isEmpty()) 
     throw new UsernameNotFoundException("User " + username + " has no authorities"); 

    List<Permission> lista = new ArrayList<Permission>(); 
    int max = account.getRole().size(); 
    for(int i=0; i<max; i++) { 
     int max2 = account.getRole().get(i).getPermission().size(); 
     for(int j=0; j<max2; j++) 
      lista.add(account.getRole().get(i).getPermission().get(j)); 
    } 

    boolean accountIsEnabled = true; 
    boolean accountNonExpired = true; 
    boolean credentialsNonExpired = true; 
    boolean accountNonLocked = true; 

    return new User(account.getLogin(), account.getSenha(), accountIsEnabled, accountNonExpired, credentialsNonExpired, accountNonLocked, getAuthorities(lista)); 
    } 
} 

Это мой application.properties файл:

# jdbc.X 
spring.datasource.driverClassName=org.postgresql.Driver 
spring.datasource.url=jdbc:postgresql://localhost:5432/mystore?charSet=LATIN1 
spring.datasource.username=klebermo 
spring.datasource.password=123 

# hibernate.X 
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect 
spring.jpa.dialect=org.hibernate.dialect.PostgreSQLDialect 
spring.jpa.show-sql=false 
spring.jpa.hibernate.ddl-auto=create-drop 

и у меня есть этот класс конфигурации, чтобы установить SessionFactory боб:

@Configuration 
public class HibernateConfig { 
    @Bean 
    public HibernateJpaSessionFactoryBean sessionFactory(EntityManagerFactory emf) { 
     HibernateJpaSessionFactoryBean factory = new HibernateJpaSessionFactoryBean(); 
     factory.setEntityManagerFactory(emf); 
     return factory; 
    } 
} 

каждый может увидеть то, что я здесь отсутствует?

+0

где вы читаете в файле application.properties для сеанс базы данных? добавьте этот код, пожалуйста, – Aeseir

+0

@Aeseir application.properties читается весной-загрузкой при запуске приложения. –

+0

К сожалению, утеряна часть загрузки. У вас есть другие файлы конфигурации для вашего спящего режима? Coz эта проблема обычно вращается вокруг потока, я могу дать вам общий ответ на основе XML-сопоставлений, которые используются, чтобы исправить это. – Aeseir

ответ

0

Итак, после дополнительных поисков я наконец нашел решение этой проблемы. Я solvw это добавить этот метод в моем Dao класс:

public Session getSessionFactory() { 
    try { 
     return sessionFactory.getCurrentSession(); 
    } catch (Exception e) { 
     return sessionFactory.openSession(); 
    } 
} 

и изменение вызова:

sessionFactory.getCurrentSession() 

в методах этого:

getSessionFactory() 

UPDATE

другое решение, которое я нашел, это использование

@Autowired 
private EntityManagerFactory factory; 

и

public EntityManager getEntityManager() { 
    return factory.createEntityManager(); 
} 

в моем классе дао, и в каждом из способов, использовать что-то вроде этого:

@Transactional 
public void insert(E object) { 
    getEntityManager().persist(object); 
} 
+2

Это не решение и потенциально опасно, поскольку вы открываете неуправляемые сеансы. Весна не управляет этими и остается открытой. Когда сеанс открыт, соединение с базой данных также открыто, это «решение» может (и будет) приводить к голоданию пула соединений и транзакциям. –

+0

@ M.Deinum Я пытаюсь использовать другой способ, используя EntityManager, как вы предлагаете. Является ли это лучшим решением по сравнению с предыдущим? –

+0

Нет реального окончательного ответа на то, что я бы сказал. Я вообще, если вы можете сделать с «EntityManager», если вам действительно нужно использовать специальные функции Hibernate, попробуйте проверить, можно ли это сделать с помощью параметра «Entitymanager» else для простого спящего режима. Но в данный момент нет ничего, что требует специального доступа к спячке. В настоящее время это только усложняет ситуацию. –

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