Java 未找到Spring OpenSessionInViewFilter和sessionFactory bean

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

我正试图在我的Spring MVC应用程序中添加OpenSessionInViewFilter,因为访问Thymeleaf模板中的集合会导致LazyInitializationException。这就是我所拥有的:

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>