当前位置: 首页 > 知识库问答 >
问题:

如何让OpenSessionInViewInterceptor在Spring mvc中工作

宁锐
2023-03-14

我正在尝试在Springmvc中设置OpenSessionInViewInterceptor来修复:org.hibernate.LazyInitializationException:无法初始化代理 - 没有会话。

下面是我已经拥有的代码以及错误的来源。

AppConfig.java

@Configuration
@PropertySource("classpath:db.properties")
@EnableTransactionManagement
@ComponentScans(value = { @ComponentScan("com.debugger.spring.web.tests"),  @ComponentScan("com.debugger.spring.web.service"), @ComponentScan("com.debugger.spring.web.dao"),
@ComponentScan("com.debugger.spring.web.controllers") })
public class AppConfig implements WebMvcConfigurer {

@Autowired
private Environment env;

@Bean
public LocalSessionFactoryBean getSessionFactory() {
    LocalSessionFactoryBean factoryBean = new LocalSessionFactoryBean();

    Properties props = new Properties();

    // Setting JDBC properties
    ...

    // Setting Hibernate properties
    ...

    // Setting C3P0 properties
        ...

    return factoryBean;
}

@Bean
public OpenSessionInViewInterceptor openSessionInViewInterceptor() {
    OpenSessionInViewInterceptor openSessionInViewInterceptor = new OpenSessionInViewInterceptor();
    openSessionInViewInterceptor.setSessionFactory(getSessionFactory().getObject());
    return openSessionInViewInterceptor;
}
}

featured.jsp

<c:choose>
                            <c:when
                                test='${article.user.isSubscribed() and article.user.subscription.type eq "silver" }'>
                                <a class="bold"
                                    href='${pageContext.request.contextPath}/u/${article.user.username}'><span
                                    class="silvername"> <c:out value="${article.user.name}"></c:out></span></a>
                            </c:when>
                            <c:when
                                test='${article.user.isSubscribed() and article.user.subscription.type eq "gold" }'>
                                <a class="bold"
                                    href='${pageContext.request.contextPath}/u/${article.user.username}'><span
                                    class="goldname"> <c:out value="${article.user.name}"></c:out></span></a>
                            </c:when>
                            <c:when
                                test='${article.user.isSubscribed() and article.user.subscription.type eq "premium" }'>
                                <a class="bold"
                                    href='${pageContext.request.contextPath}/u/${article.user.username}'><span
                                    class="premiumname"> <c:out
                                            value="${article.user.name}"></c:out></span></a>
                            </c:when>
                            <c:otherwise>
                                <a class="bold"
                                    href='${pageContext.request.contextPath}/u/${article.user.username}'><span>
                                        <c:out value="${article.user.name}"></c:out>
                                </span></a>
                            </c:otherwise>
                        </c:choose>

${article.user.isSubscribed()}抛出该错误很可能是因为无法提取用户。我希望它运行时不使用渴望获取,我想我可以通过正确设置OpenSessionInViewInterceptor来实现。

共有1个答案

谭繁
2023-03-14

在配置类中重写WebMvcConfigurer # add interceptors(InterceptorRegistry ):

@Override
public void addInterceptors(InterceptorRegistry registry) {
    OpenSessionInViewInterceptor openSessionInViewInterceptor = new OpenSessionInViewInterceptor();
    openSessionInViewInterceptor.setSessionFactory(getSessionFactory().getObject());

    registry.addWebRequestInterceptor(openSessionInViewInterceptor).addPathPatterns("/**");
}

另外,在配置类上添加<code>@EnableWebMvc</code>。

针对OP的评论:

我不确定为什么它不起作用。对我来说,一切都很好。还有另一种方法可以实现此目的:

将hibernate.enable_lazy_load_no_trans属性设置为 true

见23.9.1。获取Hibernate用户指南中的属性。

但正如《指南》所述,这不是一个很好的选择:

虽然启用此配置可以使< code > LazyInitializationException 消失,但最好使用一个提取计划来保证在会话关闭之前所有属性都已正确初始化。

In reality, you shouldn’t probably enable this setting anyway.
 类似资料:
  • java.lang.NoClassDeffounderror:org/mockito/internal/creative/cglib/classimposterizer.createProxyClass(classimposterizer.java:95)(classimposterizer.imposterise(classimposterizer.imposterise:57)(classim

  • 我试图在我的应用程序中实现jpa 发展能力 所以,我的DataConfig看起来像这样: 但是,当我尝试启动应用程序时,会出现错误消息。制造战争- 已连接到服务器[2018-09-26 09:54:32631]工件未命名:正在部署工件,请稍候。。。2018年9月26日09:54:34.460警告[RMI TCP连接(3)-127.0.0.1]组织。阿帕奇。公猫dbcp。dbcp2。基本资源工厂。g

  • 问题内容: 我已经做了几次尝试,以使包注释@ParametersAreNonnullByDefault在maven项目中为我工作,但没有成功。有人可以共享一个指向最小/示例maven项目的链接吗(或发布了pom.xml和package- info.java和demo类)? 我说的是让findbugs处理器为我实施它。 问题答案: 如何申请 在您的程序包中创建一个文件,以在其中强制执行所需的行为。

  • 这是我正在处理的代码,这是在一个列表中 我希望链接为“mylink/item.id”,但我尝试了以下操作,但没有成功: Create a variable called link and then . 和其他几个,但我得到的只是一个错误“不能将标记与C#代码混合”,所以我完全迷失在这里,有什么帮助吗? 这是一个带有Blazor的Razor页面

  • 我是一个新的android studio和尝试让我的第一个应用程序运行。hello world功能正常工作,但当我在第二个应用程序中按下send按钮时,应用程序就会关闭。 我在此基础上编写的网站教程可以在这里找到:https://developer.android.com/training/basics/firstapp/starting-activity 乔希

  • 我试图让J3D在Eclipse中工作,并且阅读了一个又一个论坛,但似乎无法解决我的问题。我用的是Ubuntu11.10 我做到了: 0)解压home/j3d目录中的j3d-1_5_2-linux-i586,然后将i386文件夹添加到usr/lib/jvm/java-6-openjdkjre/lib/i386 线程“main”java.lang.unsatisfiedlinkerror:/usr/l