[英]Spring OpenSessionInViewFilter and sessionFactory bean not found
I'm trying to add a OpenSessionInViewFilter in my Spring MVC application because accessing a collections in my Thymeleaf templates resulted in a LazyInitializationException. 我正在尝试在Spring MVC应用程序中添加OpenSessionInViewFilter,因为访问Thymeleaf模板中的集合会导致LazyInitializationException。 This is what I have:
这就是我所拥有的:
public class ApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
rootContext.register(ApplicationContext.class);
rootContext.setDisplayName("Test");
servletContext.addListener(new ContextLoaderListener(rootContext));
ServletRegistration.Dynamic dispatcher =
servletContext.addServlet("dispatcher", new DispatcherServlet(rootContext));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
FilterRegistration.Dynamic filter = servletContext.addFilter("openSessionInViewFilter", OpenSessionInViewFilter.class);
filter.setInitParameter("singleSession", "true");
filter.addMappingForServletNames(null, true, "dispatcher");
}
}
And: 和:
@Configuration
@EnableWebMvc
@ComponentScan
@Import({ SecurityConfig.class })
@PropertySource("classpath:application.properties")
@EnableJpaRepositories("test.model")
public class ApplicationContext extends WebMvcConfigurerAdapter {
@Autowired
public StringToCompany stringToCompany;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/css/**").addResourceLocations("/resources/css/**");
registry.addResourceHandler("/js/**").addResourceLocations("/resources/js/**");
registry.addResourceHandler("/images/**").addResourceLocations("/resources/images/**");
}
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(stringToCompany);
}
@Bean
public SessionBean sessionBean() {
return new SessionBean();
}
@Bean
public DataSource dataSource() {
DriverManagerDataSource datasource = new DriverManagerDataSource();
...
return datasource;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(){
LocalContainerEntityManagerFactoryBean factoryBean
= new LocalContainerEntityManagerFactoryBean();
factoryBean.setDataSource( dataSource() );
factoryBean.setPackagesToScan( new String[ ] { "test.model" } );
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
factoryBean.setJpaVendorAdapter( vendorAdapter );
factoryBean.setJpaProperties( this.additionalProperties() );
return factoryBean;
}
@Bean
public PlatformTransactionManager transactionManager(){
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(
this.entityManagerFactory().getObject() );
return transactionManager;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation(){
return new PersistenceExceptionTranslationPostProcessor();
}
Properties additionalProperties() {
Properties properties = new Properties();
...
return properties;
}
}
This results in 这导致了
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'sessionFactory' is defined
I was hoping it would be as sample as adding this: 我希望它像添加这样的样本一样:
@Bean
public AnnotationSessionFactoryBean sessionFactory() {
return new AnnotationSessionFactoryBean();
}
but that causes a while bunch of 但这导致了一堆
java.lang.NoClassDefFoundError: Lorg/hibernate/cache/CacheProvider;
I finally tried changing AnnotationSessionFactoryBean to LocalSessionFactoryBean (Hibernate 4) but that gave me 我终于尝试将AnnotationSessionFactoryBean更改为LocalSessionFactoryBean(Hibernate 4),但这给了我
Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
Can anyone help me integrate OpenSessionInViewFilter into my current setup? 任何人都可以帮我将OpenSessionInViewFilter集成到我当前的设置中吗? I'm trying not to use xml.
我试图不使用xml。
Add OpenEntityManagerInViewFilter in Spring 4 在Spring 4中添加OpenEntityManagerInViewFilter
public class WebContextInitializer implements WebApplicationInitializer{
@Override
public void onStartup(ServletContext servletContext) throws ServletException
{
AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
rootContext.register(Application.class);
rootContext.setServletContext(servletContext);
ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", new DispatcherServlet(rootContext));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
FilterRegistration.Dynamic filter = servletContext.addFilter("openEntityManagerInViewFilter", OpenEntityManagerInViewFilter.class);
filter.setInitParameter("singleSession", "true");
filter.addMappingForServletNames(null, true, "dispatcher");
/**
* Add Spring ContextLoaderListener
*/
servletContext.addListener(new ContextLoaderListener(rootContext));
}}
Or add OpenEntityManagerInViewFilter in Spring 4 in the web.xml: 或者在web.xml中的Spring 4中添加OpenEntityManagerInViewFilter:
<filter>
<filter-name>openEntityManagerInViewFilter</filter-name>
<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>openEntityManagerInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.