Java 未找到Spring OpenSessionInViewFilter和sessionFactory bean
我正试图在我的Spring MVC应用程序中添加OpenSessionInViewFilter,因为访问Thymeleaf模板中的集合会导致LazyInitializationException。这就是我所拥有的:Java 未找到Spring OpenSessionInViewFilter和sessionFactory bean,java,spring,hibernate,Java,Spring,Hibernate,我正试图在我的Spring MVC应用程序中添加OpenSessionInViewFilter,因为访问Thymeleaf模板中的集合会导致LazyInitializationException。这就是我所拥有的: public class ApplicationInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext servletCont
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");
}
}
以及:
这导致
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'sessionFactory' is defined
我希望它会像添加以下内容一样简单:
@Bean
public AnnotationSessionFactoryBean sessionFactory() {
return new AnnotationSessionFactoryBean();
}
但这会导致一段时间的
java.lang.NoClassDefFoundError: Lorg/hibernate/cache/CacheProvider;
我最终尝试将AnnotationSessionFactoryBean更改为LocalSessionFactoryBean(Hibernate4),但这给了我很大的帮助
Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
有人能帮我将OpenSessionInViewFilter集成到当前设置中吗?我试图不使用xml。在Spring 4中添加OpenEntityManagerViewFilter
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));
}}
或者将Spring 4中的OpenEntityManagerViewFilter添加到web.xml中:
<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>
OpenEntityManager视图过滤器
org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
单一会话
真的
OpenEntityManager视图过滤器
/*
不要使用OpenSessionInViewFilter
使用OpenEntityManagerInViewFilter
OpenEntityManagerInViewFilter
成功了,谢谢!不要使用OpenSessionInViewFilter或OpenEntityManagerViewFilter-为前端完全填充DTO,而不是将持久性JPA实体传递给前端。您当前正在让UI指定数据库访问模式。您能提供此问题的最终答案吗?我想看看代码。
<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>