我的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
我的配置存在哪些缺陷?
答案 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();
}
...
}