Как заставить OpenSessionInViewInterceptor работать в Spring mvc - PullRequest
0 голосов
/ 21 декабря 2018

Я пытаюсь настроить OpenSessionInViewInterceptor весной mvc для исправления: 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.isSubscribeed ()} генерирует ошибку, скорее всего, потому что пользователь не может быть выбран.Я хочу, чтобы он запускался без использования активной выборки, и я думаю, что могу добиться этого, правильно настроив OpenSessionInViewInterceptor.

1 Ответ

0 голосов
/ 21 декабря 2018

Переопределить WebMvcConfigurer # addInterceptors (InterceptorRegistry) в вашем классе конфигурации:

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

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

Также добавьте @EnableWebMvc в классе конфигурации.

Inответ на комментарий ОП:

Я не уверен, почему он не работает.Мне кажется, все в порядке.Это можно сделать еще одним способом:

Установить hibernate.enable_lazy_load_no_trans свойство true.

См. 23.9.1.Выбор свойств в Hibernate User Guide для получения дополнительной информации.

Но это , а не очень хороший вариант, как указано в руководстве:

Хотя включение этой конфигурации может привести к потере LazyInitializationException, лучше использовать план выборки, который гарантирует, что все свойства будут правильно инициализированы до закрытия сеанса.

In reality, you shouldn’t probably enable this setting anyway.
...