2014-11-25 3 views
1

현재 스프링 부트 프로젝트에서 데이터베이스에서 쿼리를 수행 할 때 DAO 클래스에서이 메서드를 사용합니다. 개발의 단계) :응용 프로그램이 데이터베이스에서 쿼리를 수행 할 때 "No CurrentSessionContext configured"가 표시됩니다.

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(); 
    } 
} 

나는이 오류가 무엇입니까 :

@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)); 
    } 
} 
:

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 

이 방법이 서비스 클래스에서 호출을

이 내 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는 spring-boot가 읽습니다. –

+0

Oops가 부팅 부분을 놓쳤습니다. 최대 절전 모드에 대한 다른 설정 파일이 있습니까? 이 문제는 대개 스레드 주위를 돌며,이 문제를 해결하는 데 사용되는 XML 매핑을 기반으로 일반 응답을 제공 할 수 있습니다. – Aeseir

답변

0

좋아, 그럼 더 많은 검색이 마침내이 문제에 대한 해결책을 찾으십시오. 나는이 내 다오 클래스에이 방법을 추가 solvw :

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

하고 통화 변경이의 방법에

sessionFactory.getCurrentSession() 

:

getSessionFactory() 

UPDATE를

내가 찾은 또 다른 해결책

이 같은 6,
@Autowired 
private EntityManagerFactory factory; 

내 DAO 클래스에서

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

, 그리고 각각의 방법에서, 사용 무언가 :

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

이것은 관리되지 않는 세션을 열 때 솔루션과 잠재적으로 위험하지 않습니다. 스프링은이를 관리하지 않고 열려 있습니다. 세션이 열려 있으면 데이터베이스 연결도 열려 있으므로이 "솔루션"은 연결 풀 기아 및 트랜잭션 문제를 일으킬 수 있습니다. –

+0

@ M.Deinum 당신이 제안한 것처럼 EntityManager를 사용하여 다른 방법을 시도합니다. 이전 솔루션과 비교하여 더 나은 솔루션입니까? –

+0

내가 말할 수있는 확실한 답은 없습니다. 만약 당신이 정말로 Hibernate 특정 기능들을 사용하기를 원한다면'EntityManager'로 할 수 있다면 일반 적으로'Entitymanager'를 사용하여 일반 Hibernate로 전환 할 수 있는지 알아 봅니다. 하지만 현재로서는 최대 절전 모드 액세스가 필요하지 않습니다. 현재 상황을 복잡하게 만듭니다. –