在RootConfig中@EnableTransactionManagement无法正常工作

时间:2017-09-28 10:06:30

标签: spring spring-mvc spring-security spring-transactions

我的Spring(4.3.9-RELEASE)配置存在问题。

我正在运行一个WebMVC应用程序,一切都适用于我当前的配置。

由于并发症的整体复杂性,我将省略一些我认为不重要的内容。如果您遗漏了重要的内容,请与我们联系。

@WebServlet 
@PropertySource("classpath:myAppConf.properties")
public class ServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

        @Override
        protected Class<?>[] getRootConfigClasses() {
                return new Class[] {MainAppConfig.class } ;
        }

        @Override
        protected Class<?>[] getServletConfigClasses() {
                return new Class[] {WebAppConfig.class };
        }

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

        @Override
        protected String getServletName() {
                return "myServletFooBar";
        }

}

MainAppConfig:

@Configuration
@Import({HibernateConfig.class})
@EnableGlobalMethodSecurity(prePostEnabled=true)
@ComponentScan(basePackages = { "my.app.security"})
public class MainAppConfig {
    ...
}

WebAppConfig:

@EnableWebMvc()
@Configuration()
@ComponentScan(basePackages = { "my.app.controller" })
@Import({ServiceConfig.class})
@EnableTransactionManagement
public class WebAppConfig extends WebMvcConfigurerAdapter{
    ...
}

我的@Transactional(注释为WebAppConfiguration)中包含我的所有控制器和服务(注释为@EnableTransactionManagement)。我的Hibernate配置(事务管理器,数据源等)位于我的MainAppConfiguration

此配置的交易正常。

现在我需要在MainAppConfiguration - Context中进行事务处理(对于自定义的Spring-Security AuthenticationProvider(从DaoAuthenticationProvider扩展而来)。

这不起作用,因为我@EnableTransactionManagement上有WebAppConfig。尝试从我的自定义身份验证提供程序运行事务时,我收到以下错误。

org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread

所以我尝试将我的所有服务移动到我的MainAppConfig(也是@EnableTransactionManagement注释),但后来我在Controlloer方法中收到了相同的消息,这些消息正在调用服务。

我还尝试将@EnableGlobalMethodSecurity(prePostEnabled=true)@ComponentScan(basePackages = { "my.app.security"})注释从我的MainAppConfig移动到我的WebAppConfig(在我看来这更有意义)。但是Spring-Security抱怨说,有No bean named 'springSecurityFilterChain' available

我的配置存在哪些缺陷?

1 个答案:

答案 0 :(得分:0)

由于@M的提示,我找到了一个适合我的解决方案。 Deinum:

我将所有服务移动到RootContext(在我的情况下为MainAppConfig.class)。但不是直接,我导入了另一个包含我所有Service-Beans的配置:

@Import(ServiceConfig.class)
public class MainAppConfig {
   ...
}

在我的ServiceConfig.class内我获得了所有服务 - @Bean - 定义。 重要的是,ServiceConfig使用@EnableTransactionManagement进行注释。如果你把它放在MainConfig - 类交易将无法正常工作。

@EnableTransactionManagement
public class ServiceConfig {
     @Bean(name="userService")
     UserService userService() {
         return new UserServiceImpl();      
     }
     ...
}