OpenEntityManagerInViewFilter无法正常工作 - Spring MVC

时间:2014-03-22 20:54:37

标签: spring hibernate spring-mvc jpa

好的,所以我再次疯狂地试图解决OpenEntityManagerInViewFilter问题。

我已经环顾了一堆,阅读了很多其他问题(这看起来似乎是重复的)但到目前为止还没有快乐。

所以这里的交易是:Spring4,基于XML的web.xml,但java vconfig用于我的应用程序上下文设置的其余部分。我认为它可能与此解决方案有关:https://stackoverflow.com/a/7015927/258813(ContextLoadListener和servlet配置都加载应用程序上下文),但是,我确保它们都显式引用不同的配置文件。我之前也有问题,当不同的配置文件是@ ComponentScan-ing相同的位置,所以上下文加载了两次,但情况也不是这样。

Web.xml(相关位)

<servlet>
        <servlet-name>webapp</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextClass</param-name>
            <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
        </init-param>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>com.tmm.frm.configuration.WebMvcConfiguration</param-value>
        </init-param>
    </servlet>

<context-param>
    <param-name>contextClass</param-name>
    <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</context-param>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        com.tmm.frm.configuration.ApiSecurityConfig
        com.tmm.frm.configuration.ApplicationContextConfiguration
        com.tmm.frm.configuration.WebSecurityConfig
    </param-value>
</context-param>

安全配置只是标准的WebSecurityConfigurerAdapter扩展,没有其他扫描/上下文爵士乐。

WebMvc config:

@Configuration
@EnableWebMvc
@ComponentScan("com.tmm.frm.controller")
public class WebMvcConfiguration extends WebMvcConfigurerAdapter{

App Context Config(持久性等)

@Configuration
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ, proxyTargetClass = true)
@ComponentScan({"com.tmm.frm.service", "com.tmm.frm.helper","com.tmm.frm.core.dao", "com.tmm.frm.security"})
@PropertySource("classpath:META-INF/spring/database.properties")
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class ApplicationContextConfiguration {

因此,相关的配置类都专门定义了不同的包等.Web.xml名称配置为按名称加载,因此两个配置类都没有被加载两次。

然后,我点击控制器 - 我从Secuirty Context(在控制器中)加载用户配置文件,然后我尝试循环遍历加载了懒惰的UserProfile上的集合 - 我希望OpenEntityManagerInViewFilter能够启动并加载集合(因为会话仍然打开)但我得到正常的加载懒惰对象错误。日志明确指出过滤器被调用,所以我假设有两个上下文 - 任何一个建议流氓上下文可能在哪里?

1 个答案:

答案 0 :(得分:1)

根据您的说法,您正在从安全上下文加载UserProfile,可能是您在用户登录时加载了安全上下文。 现在,用于在登录时加载UserProfile以加载EntityManager的{​​{1}}对于通过登录进入系统的新请求肯定不会有效,因此也就是错误。范围与一个Web请求范围相关联。

我将看到的唯一好的解决方法是仅在securitycontext中保留用户的某些标识符,并在需要其他详细信息时加载实际的用户详细信息,或者最初存储其他详细信息。