2016-09-20 21 views
7

Tôi đã đọc các câu trả lời khác về các câu hỏi tương tự, nhưng tôi không tìm thấy giải pháp cho vấn đề của mình. Tôi có một máy chủ Tomcat7 và một ứng dụng Spring sử dụng Hibernate để kết nối với DB từ xa PostgreSQL của tôi. phiên bản khuôn khổ của tôi là: Spring framework 4.2.2 mùa xuân an ninh 3.2.5 Hibernate 4.3.6Hibernate không thể lấy phiên được đồng bộ hóa giao dịch cho chuỗi hiện tại trên máy chủ từ xa

Khi tôi chạy ứng dụng của tôi trên tất cả mọi thứ localhost là tốt, nhưng khi tôi triển khai nó trên máy chủ của tôi, tôi nhận được lỗi này về đăng nhập:

org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread 
    org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:134) 
    org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1014) 
    org.myapp.spring.dao.generic.GenericDAOImpl.getSession(GenericDAOImpl.java:59) 
    org.myapp.spring.dao.impl.DeveloperDaoImpl.findByUsername(DeveloperDaoImpl.java:51) 
    org.myapp.spring.service.impl.DeveloperServiceImpl.findByUsername(DeveloperServiceImpl.java:149) 
    org.myapp.spring.web.security.UserDetailsServiceImpl.loadUserByUsername(UserDetailsServiceImpl.java:23) 
    org.myapp.spring.web.security.MyAuthenticationProvider.authenticate(MyAuthenticationProvider.java:30) 
    org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:167) 
    org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:192) 
    org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter.attemptAuthentication(UsernamePasswordAuthenticationFilter.java:93) 
    org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:217) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
    org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:120) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
    org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:64) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
    org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:91) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
    org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:53) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
    org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:213) 
    org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:176) 
    org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) 
    org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) 

tôi có hai inizializer file:

public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 

    @Override 
    protected Class<?>[] getRootConfigClasses() { 
     Class[] config = {AppConfig.class}; 
     return config; 
    } 

    @Override 
    protected Class<?>[] getServletConfigClasses() { 
     Class[] config = {SecurityConfig.class, HibernateConfig.class}; 
     return config; 
    } 

    @Override 
    protected String[] getServletMappings() { 
     return new String[] { "/" }; 
    } 

012.351.
@Component 
public class SecurityWebApplicationInizializer extends AbstractSecurityWebApplicationInitializer { 
} 

và ba file Config:

@EnableWebMvc 
@ComponentScan({ "org.myapp.spring.*" }) 
@EnableTransactionManagement 
@PropertySource(value="classpath:myapp.properties") 
public class AppConfig extends WebMvcConfigurerAdapter implements ApplicationContextAware { 

    @Autowired 
    private TokenInterceptor tokenInterceptor; 
    private ApplicationContext applicationContext; 
    private static final String UTF8 = "UTF-8"; 

    @Override 
    public void setApplicationContext(ApplicationContext applicationContext) { 
     this.applicationContext = applicationContext; 
    } 

    @Override 
    public void addInterceptors(InterceptorRegistry registry) { 
     registry.addInterceptor(tokenInterceptor); 
    } 

//other methods 
} 

@Configuration 
@EnableWebSecurity 
@EnableTransactionManagement 
@ComponentScan("org.myapp.spring.web.security") 
@EnableGlobalMethodSecurity(prePostEnabled = true) 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

@Autowired private MyAuthenticationProvider authProvider; 
@Autowired private UserDetailsService userDetailsService; 

@Autowired 
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
    auth.authenticationProvider(authProvider); 
    auth.userDetailsService(userDetailsService); 
} 

@Override 
public void configure(WebSecurity web) throws Exception { 
    DefaultWebSecurityExpressionHandler handler = new DefaultWebSecurityExpressionHandler(); 
    handler.setPermissionEvaluator(permissionEvaluator()); 
    web.expressionHandler(handler); 
} 

@Bean 
public PermissionEvaluator permissionEvaluator() { 
    return new MyPermissionEvaluator(); 
} 

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http.csrf().and() 
    .formLogin().loginPage("/html/login").defaultSuccessUrl("/html/index", true).permitAll() 
    .and() 
    .logout().logoutUrl("/html/logout").logoutSuccessUrl("/html/login?logout").invalidateHttpSession(true).clearAuthentication(true).permitAll() 
    .and() 
    .authorizeRequests() 
    .antMatchers("/html/forbidden").permitAll() 
    .antMatchers("/html/logistic").permitAll() 
    .antMatchers("/html/ajax/logistic").permitAll() 
    .antMatchers("/html/res/**").permitAll() 
    .antMatchers("/html").authenticated() 
    .antMatchers("/html/**").authenticated() 
    .and() 
    .exceptionHandling().accessDeniedPage("/html/forbidden"); 
} 

}

và cuối cùng:

@Configuration 
@EnableTransactionManagement 
@ComponentScan({ "org.myapp.spring.configuration" }) 
@PropertySource(value = { "classpath:hibernate.properties" }) 
public class HibernateConfig { 

@Autowired 
private Environment environment; 

@Bean 
public LocalSessionFactoryBean sessionFactory() { 
    LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); 
    sessionFactory.setDataSource(dataSource()); 
    sessionFactory.setPackagesToScan(new String[] { "org.myapp.spring.model"}); 
    sessionFactory.setHibernateProperties(hibernateProperties()); 

    try { 
     sessionFactory.afterPropertiesSet(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return sessionFactory; 
} 

@Bean 
public DataSource dataSource() { 
    DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
    dataSource.setDriverClassName(environment.getRequiredProperty("hibernate.connection.driver_class")); 
    dataSource.setUrl(environment.getRequiredProperty("hibernate.connection.url")); 
    dataSource.setUsername(environment.getRequiredProperty("hibernate.connection.username")); 
    dataSource.setPassword(environment.getRequiredProperty("hibernate.connection.password")); 
    return dataSource; 
} 

private Properties hibernateProperties() { 
    Properties properties = new Properties(); 
    properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect")); 
    properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql")); 
    properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql")); 
    return properties; 
} 

@Bean 
@Autowired 
public HibernateTransactionManager transactionManager(SessionFactory s) { 
    HibernateTransactionManager txManager = new HibernateTransactionManager(); 
    txManager.setSessionFactory(s); 
    return txManager; 
} 
} 

GenericDaoImpl là:

@Repository 
public abstract class GenericDAOImpl<T> implements DAO<T> { 

    @Autowired 
    private SessionFactory sessionFactory; 

protected Session getSession() { 
      return sessionFactory.getCurrentSession(); 
     } 

} Mỗi DAO mở rộng lớp này và có chú thích @Repository của riêng mình.

Mọi dịch vụ đều được chú thích là @transactional. Đây là việc triển khai UserDetailsService:

@Service 
@Transactional 
public class UserDetailsServiceImpl implements UserDetailsService, MyUserDetailsService { 

    @Autowired private DeveloperService devService; 
    @Autowired private AuthorizationService authorizationService; 

    @Override 
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 
     if(username == null) { 
      throw new UsernameNotFoundException("User not found"); 
     } 
     Developer dev = devService.findByUsername(username); 

     if(dev == null) { 
      throw new UsernameNotFoundException("User not found"); 
     } 
     MyUserDetails user = new MyUserDetails(); 
     user.setUsername(dev.getUsername()); 
     user.setPassword(dev.getPassword()); 
     user.setMaxAuthorityByIndex(dev.getRole()); 
     return user; 
    } 

Tôi thực sự không biết điều này có thể là gì. Có thể một cấu hình sai trên máy chủ? Đối với tôi nó dường như là đúng ...

+0

Vấn đề là bạn có 2 trường hợp dịch vụ của bạn ... Một với các giao dịch không được sử dụng. Bạn là thành phần quét cho quá nhiều thứ trong các cấu hình khác nhau không làm điều đó. Cấu hình bảo mật và hibernate của bạn cũng phải là một phần của cấu hình gốc. Cấu hình servlet chỉ nên bao gồm các thứ liên quan đến web (bộ điều khiển, khung nhìn và cơ sở hạ tầng cho điều đó). –

+0

Vì vậy, bạn đang nói tôi chỉ nên sử dụng một tệp cấu hình? – zuno

+0

Không, tôi không ... Tôi nói rằng bạn nên cẩn thận trong những gì và ở đâu bạn đang sử dụng quét thành phần và rằng các loại thích hợp của các lớp học nên được nạp bởi các thành phần thích hợp. 'ContextLoaderListener' nên, lý tưởng nhất, chứa các dịch vụ cơ sở hạ tầng như' DataSource', 'EntityManagerFactory' mà còn cả dịch vụ, kho lưu trữ, vv' DispatcherServlet' của bạn sẽ chứa những thứ liên quan đến web '@ EnableWebMvc' và những thứ như controller, views nhưng không có dịch vụ . –

Trả lời

0

thêm video này vào bạn

private Properties hibernateProperties() { 
     Properties properties = new Properties(); 
     properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect")); 
     properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql")); 
     properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql")); 
     properties.put("current_session_context_class","org.springframework.orm.hibernate4.SpringSessionContext"); 
     return properties; 
    } 
Các vấn đề liên quan