2015-12-23 6 views
7

Я пытаюсь вернуть один из моих объектов на страницу JSP, но получить следующую ошибку «не удалось лениво инициализировать коллекцию роли». Я добавил фильтр openEntityManagerInView (предположим, что это позволит диспетчеру сущности оставаться открытым в представлении?), Но все равно получить эту ошибку.Использование openEntityManagerInView по-прежнему «не удалось лениво инициализировать коллекцию роли»

Мое приложение настроено с использованием java config no xml.

Ниже приведено мое диспетчерское сообщение. Вы можете видеть, что я добавил фильтр openEntityManagerInView.

Любые идеи, почему это так? Я проверил похожие вопросы по stackoverflow и не повезло с предоставленными решениями.

public class DispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 

@Override 
public void onStartup(ServletContext servletContext) throws ServletException { 

    registerOpenEntityManagerInViewFilter(servletContext); 
    super.onStartup(servletContext); 

} 

private void registerOpenEntityManagerInViewFilter(ServletContext servletContext) { 
    OpenEntityManagerInViewFilter viewFilter = new OpenEntityManagerInViewFilter(); 
    viewFilter.setEntityManagerFactoryBeanName("entityManagerFactory"); 
    FilterRegistration.Dynamic registration = servletContext.addFilter("openEntityManagerInView", 
      new OpenEntityManagerInViewFilter()); 
    registration.addMappingForUrlPatterns(null, false, "/*"); 

} 

@Override 
protected Class<?>[] getRootConfigClasses() { 
    return new Class<?>[]{Config.class, SecurityConfig.class}; 
} 

@Override 
protected Class<?>[] getServletConfigClasses() { 
    return new Class<?>[]{WebConfig.class}; 
} 

@Override 
protected String[] getServletMappings() { 
    return new String[]{"/"}; 
} 

}

Ниже сущность под вопросом. Я опустил геттеры и сеттеры.

@Entity 
@Table(name = "film") 
public class Film { 

@Id 
@GeneratedValue 
@Column(name = "film_id") 
private int filmId; 
@Column(name = "title") 
private String title; 
@Column(name = "description") 
private String description; 
@Column(name = "release_year") 
private int releaseYear; 
@ManyToOne 
@JoinColumn(name = "language_id") 
private Language language; 
@ManyToOne 
@JoinColumn(name = "original_language_id") 
private Language originalLanguage; 
@Column(name = "rental_duration") 
private int rentalDuration; 
@Column(name = "rental_rate") 
private double rentalRate; 
@Column(name = "length") 
private int length; 
@Column(name = " replacement_cost") 
private double replacementCost; 
@Column(name = "rating") 
private String rating; 
@Column(name = "special_features") 
private String specialFeatures; 
@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "last_update") 
private Date lastUpdate; 
@OneToMany(mappedBy = "film", cascade = CascadeType.ALL) 
private List<Inventory> inventories; 

......... 
} 

Ниже приведена моя конфигурация для моего материала JPA.

@Configuration 
@EnableTransactionManagement 
public class Config { 

@Bean(name = "entityManagerFactory") 
public EntityManagerFactory entityManagerFactory() { 
    LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean(); 
    HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter(); 
    HibernateJpaDialect hibernateJpaDialect = new HibernateJpaDialect(); 
    emf.setDataSource(dataSource()); 
    emf.setPackagesToScan("com"); 
    emf.setJpaDialect(hibernateJpaDialect); 
    emf.setJpaVendorAdapter(hibernateJpaVendorAdapter); 
    /* Map<String,String> props = new HashMap<>(); 
    props.put("hibernate.show_sql", "true"); 
    emf.setJpaPropertyMap(props);*/ 
    emf.afterPropertiesSet(); 
    return emf.getObject(); 
} 

@Bean(name = "transactionManager") 
public PlatformTransactionManager transactionManager() throws IOException { 
    JpaTransactionManager jtm 
      = new JpaTransactionManager(); 
    jtm.setEntityManagerFactory(entityManagerFactory()); 
    jtm.setDataSource(dataSource()); 
    return jtm; 
} 

@Bean(name = "dataSource") 
public DriverManagerDataSource dataSource() { 
    DriverManagerDataSource dds = new DriverManagerDataSource(); 
    dds.setDriverClassName("com.mysql.jdbc.Driver"); 
    dds.setUrl("jdbc:mysql://localhost/test"); 
    dds.setUsername("username"); 
    dds.setPassword("password"); 
    return dds; 
} 

} 

Ниже мой веб-конфигурация

@Configuration 
@EnableWebMvc 
@ComponentScan("com") 
public class WebConfig { 

@Bean 
public ViewResolver viewResolver() { 
    InternalResourceViewResolver vr = new InternalResourceViewResolver(); 
    vr.setViewClass(JstlView.class); 
    vr.setPrefix("/WEB-INF/jsp/"); 
    vr.setSuffix(".jsp"); 
    vr.setExposeContextBeansAsAttributes(true); 
    return vr; 
} 

} 

Ниже моя конфигурация безопасности.

@Configuration 
@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

@Autowired 
public void configureAuthenticationManagerBuilder(AuthenticationManagerBuilder auth) throws Exception { 
    auth 
      .inMemoryAuthentication() 
      .withUser("user").password("password").roles("USER"); 
} 

@Override 
protected void configure(HttpSecurity http) throws Exception { 
     http.authorizeRequests() 
    .antMatchers("/**").access("hasRole('ROLE_USER')") 
    .and().formLogin().loginPage("/login") 
    .usernameParameter("username") 
    .passwordParameter("password") 
    .defaultSuccessUrl("/index", true).failureUrl("/login?error") 
    .loginProcessingUrl("/j_spring_security_check"); 

} 

@Override 
public void configure(WebSecurity web) throws Exception { 
    web.ignoring().antMatchers("/login"); 
} 

} 

Мой класс Dao ниже.

@Repository 
public class FilmDao { 

    @PersistenceContext 
    private EntityManager em; 

    public Film getFilm(int filmId) { 
     Film film = em.find(Film.class, filmId); 
     return film; 
    } 

} 

Сервисный класс, ниже которого вызывается мои контроллеры.

@Service 
public class FilmService { 

    @Autowired 
    private FilmDao filmDao; 

    @Transactional 
    public Film getFilm(int filmId) { 
     Film film = filmDao.getFilm(filmId); 
     return film; 
    } 

} 

След стека ниже.

14:48:30,416 ERROR [io.undertow.request] (default task-6) UT005023: Exception handling request to /test-app/WEB-INF/jsp/update_inventory.jsp: org.apache.jasper.JasperException: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.jm.sakila.entity.Film.inventories, could not initialize proxy - no Session 
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:410) [jastow-1.0.0.Final.jar:1.0.0.Final] 
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:326) [jastow-1.0.0.Final.jar:1.0.0.Final] 
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:259) [jastow-1.0.0.Final.jar:1.0.0.Final] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) [jboss-servlet-api_3.1_spec-1.0.0.Final.jar:1.0.0.Final] 
    at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final] 
    at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:82) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final] 
    at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:61) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final] 
    at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final] 
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final] 
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final] 
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final] 
    at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:249) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final] 
    at io.undertow.servlet.handlers.ServletInitialHandler.dispatchToPath(ServletInitialHandler.java:192) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final] 
    at io.undertow.servlet.spec.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:160) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final] 
    at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:168) [spring-webmvc-4.2.2.RELEASE.jar:4.2.2.RELEASE] 
    at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:303) [spring-webmvc-4.2.2.RELEASE.jar:4.2.2.RELEASE] 
    at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1244) [spring-webmvc-4.2.2.RELEASE.jar:4.2.2.RELEASE] 
    at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1027) [spring-webmvc-4.2.2.RELEASE.jar:4.2.2.RELEASE] 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:971) [spring-webmvc-4.2.2.RELEASE.jar:4.2.2.RELEASE] 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) [spring-webmvc-4.2.2.RELEASE.jar:4.2.2.RELEASE] 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) [spring-webmvc-4.2.2.RELEASE.jar:4.2.2.RELEASE] 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) [spring-webmvc-4.2.2.RELEASE.jar:4.2.2.RELEASE] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) [jboss-servlet-api_3.1_spec-1.0.0.Final.jar:1.0.0.Final] 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) [spring-webmvc-4.2.2.RELEASE.jar:4.2.2.RELEASE] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) [jboss-servlet-api_3.1_spec-1.0.0.Final.jar:1.0.0.Final] 
    at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final] 
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:130) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final] 
    at org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:178) [spring-orm-4.2.2.RELEASE.jar:4.2.2.RELEASE] 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.2.2.RELEASE.jar:4.2.2.RELEASE] 
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final] 
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final] 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) [spring-security-web-3.2.9.RELEASE.jar:3.2.9.RELEASE] 
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118) [spring-security-web-3.2.9.RELEASE.jar:3.2.9.RELEASE] 
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84) [spring-security-web-3.2.9.RELEASE.jar:3.2.9.RELEASE] 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) [spring-security-web-3.2.9.RELEASE.jar:3.2.9.RELEASE] 
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) [spring-security-web-3.2.9.RELEASE.jar:3.2.9.RELEASE] 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) [spring-security-web-3.2.9.RELEASE.jar:3.2.9.RELEASE] 
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103) [spring-security-web-3.2.9.RELEASE.jar:3.2.9.RELEASE] 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) [spring-security-web-3.2.9.RELEASE.jar:3.2.9.RELEASE] 
    at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113) [spring-security-web-3.2.9.RELEASE.jar:3.2.9.RELEASE] 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) [spring-security-web-3.2.9.RELEASE.jar:3.2.9.RELEASE] 
    at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:154) [spring-security-web-3.2.9.RELEASE.jar:3.2.9.RELEASE] 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) [spring-security-web-3.2.9.RELEASE.jar:3.2.9.RELEASE] 
    at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45) [spring-security-web-3.2.9.RELEASE.jar:3.2.9.RELEASE] 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) [spring-security-web-3.2.9.RELEASE.jar:3.2.9.RELEASE] 
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110) [spring-security-web-3.2.9.RELEASE.jar:3.2.9.RELEASE] 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) [spring-security-web-3.2.9.RELEASE.jar:3.2.9.RELEASE] 
    at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:57) [spring-security-web-3.2.9.RELEASE.jar:3.2.9.RELEASE] 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.2.2.RELEASE.jar:4.2.2.RELEASE] 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) [spring-security-web-3.2.9.RELEASE.jar:3.2.9.RELEASE] 
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) [spring-security-web-3.2.9.RELEASE.jar:3.2.9.RELEASE] 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) [spring-security-web-3.2.9.RELEASE.jar:3.2.9.RELEASE] 
    at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50) [spring-security-web-3.2.9.RELEASE.jar:3.2.9.RELEASE] 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.2.2.RELEASE.jar:4.2.2.RELEASE] 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) [spring-security-web-3.2.9.RELEASE.jar:3.2.9.RELEASE] 
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192) [spring-security-web-3.2.9.RELEASE.jar:3.2.9.RELEASE] 
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160) [spring-security-web-3.2.9.RELEASE.jar:3.2.9.RELEASE] 
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) [spring-web-4.2.2.RELEASE.jar:4.2.2.RELEASE] 
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) [spring-web-4.2.2.RELEASE.jar:4.2.2.RELEASE] 
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final] 
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final] 
    at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:85) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final] 
    at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:61) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final] 
    at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final] 
    at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78) 
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final] 
    at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final] 
    at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:56) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final] 
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final] 
    at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:45) [undertow-core-1.1.0.Final.jar:1.1.0.Final] 
    at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:63) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final] 
    at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58) [undertow-core-1.1.0.Final.jar:1.1.0.Final] 
    at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:70) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final] 
    at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76) [undertow-core-1.1.0.Final.jar:1.1.0.Final] 
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final] 
    at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61) 
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final] 
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final] 
    at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:261) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final] 
    at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:247) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final] 
    at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:76) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final] 
    at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:166) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final] 
    at io.undertow.server.Connectors.executeRootHandler(Connectors.java:197) [undertow-core-1.1.0.Final.jar:1.1.0.Final] 
    at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:759) [undertow-core-1.1.0.Final.jar:1.1.0.Final] 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_45] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_45] 
    at java.lang.Thread.run(Thread.java:744) [rt.jar:1.7.0_45] 
Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.jm.sakila.entity.Film.inventories, could not initialize proxy - no Session 
    at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:576) [hibernate-core-4.3.11.Final.jar:4.3.11.Final] 
    at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:215) [hibernate-core-4.3.11.Final.jar:4.3.11.Final] 
    at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:555) [hibernate-core-4.3.11.Final.jar:4.3.11.Final] 
    at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:143) [hibernate-core-4.3.11.Final.jar:4.3.11.Final] 
    at org.hibernate.collection.internal.PersistentBag.iterator(PersistentBag.java:294) [hibernate-core-4.3.11.Final.jar:4.3.11.Final] 
    at org.apache.taglibs.standard.tag.common.core.ForEachSupport.toIterator(ForEachSupport.java:72) [jboss-jstl-api_1.2_spec-1.1.2.Final.jar:1.1.2.Final] 
    at org.apache.taglibs.standard.tag.common.core.ForEachSupport.prepare(ForEachSupport.java:66) [jboss-jstl-api_1.2_spec-1.1.2.Final.jar:1.1.2.Final] 
    at javax.servlet.jsp.jstl.core.LoopTagSupport.doStartTag(LoopTagSupport.java:241) [jboss-jstl-api_1.2_spec-1.1.2.Final.jar:1.1.2.Final] 
    at org.apache.jsp.WEB_002dINF.jsp.update_005finventory_jsp._jspx_meth_c_005fforEach_005f1(update_005finventory_jsp.java:231) 
    at org.apache.jsp.WEB_002dINF.jsp.update_005finventory_jsp._jspx_meth_c_005fif_005f1(update_005finventory_jsp.java:194) 
    at org.apache.jsp.WEB_002dINF.jsp.update_005finventory_jsp._jspService(update_005finventory_jsp.java:83) 
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:69) [jastow-1.0.0.Final.jar:1.0.0.Final] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) [jboss-servlet-api_3.1_spec-1.0.0.Final.jar:1.0.0.Final] 
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:366) [jastow-1.0.0.Final.jar:1.0.0.Final] 
    ... 86 more 

Спасибо.

+0

вы можете оставить стека исключений трассировки? –

+0

Да, пожалуйста, публикуйте журналы исключений. – DavidR

+0

@DavidR добавлен полный stracktrace спасибо. – JCS

ответ

0

Сделка была завершена до отображения JSP, и, следовательно, сеанс Hibernate больше не доступен для ленивой загрузки указанного свойства.

Альтернативное решение (которое не требует использования фильтра OEMIV): если вы хотите сохранить отложенной загрузки для указанного свойства коллекции в другом месте в коде, создать отдельный метод поиска findFilmWithInventories для извлечения лица и сделать join fetch запрос на загрузку указанной коллекции.

+0

Это еще один неправильный ответ, когда пользователь пытается использовать Open Entity Manager в шаблоне просмотра. –

+0

Если вы внимательно прочитали, что ОП попытался решить проблему с использованием указанного фильтра. Публикация альтернативных решений не является «неправильным ответом». – Jukka

+0

, если он пытается использовать OEMIV, я думаю, он знает, что сеанс по умолчанию больше недоступен при визуализации JSP. Правильный ответ - сказать ему, почему фильтр не работает. –

0

Может быть, в этом случае, это гораздо проще отказаться от OpenSessionInView/OpenEntityManagerInView и использовать

<property name="hibernate.enable_lazy_load_no_trans" value="true" /> 

в persistence.xml (или настроить его программно).

Это свойство имеет аналогичное поведение (и плюсы/минусы) OSIV, за исключением того, что новый EntityManager может быть создан при каждом запуске триггерной загрузки, вместо того, чтобы иметь одиночный и длинный охват, поэтому вам нужно знать чтобы правильно управлять контекстом персистентности.

Однако это никогда не сработает с no Session.

+1

Я бы настоятельно советовал использовать эту функцию Hibernate. Новый EntityManager, автоматически созданный для загрузки непривязанных ленивых ассоциаций, означает, что кеш-память первого уровня между этими запросами отсутствует. Вы можете легко завершить навигацию по объекту, где, перемещаясь по двум различным путям к одному и тому же объекту базы данных, вы можете получить два разных экземпляра одного и того же объекта. Предположим, вы собираетесь изменить этот логический объект и хотите объединить его обратно в db. Hibernate откажется объединить его, поскольку он найдет два отдельных экземпляра объекта для одного и того же логического объекта. –

+1

И я даже не упоминал, что у вас вообще нет изоляции транзакций. –

+0

Прошу прощения, я не согласен. Вы не должны консультироваться с какой-либо особенностью абсолютно. Поскольку мы говорим о OSIV, вероятно, OP уже используется для управления ** отдельными ** сущностями (и разными экземплярами одного и того же объекта). Что касается изоляции транзакций, я не вижу проблемы, так как * enable_lazy_load_no_trans * - это ленивая загрузка ** без ** использования транзакции. –

1

Проблема очень проста.

В вашей JSP ваш фильм возвращаются из public Film getFilm(int filmId) На странице JSP вы, вероятно, делать что-то вроде:

<jsp:getProperty name="film" property="inventories" /> 

Вы пытаетесь получить invetories, но это была ленивая загрузка и сессия уже закрыта (@Transactional аннотация открыть сеанс и закрывается, когда метод завершен)

Так как вы будете создавать новый метод, чтобы получить inverntories от FilmID или сделать его жадную загрузку:

@OneToMany(fetch=FetchType.EAGER, mappedBy = "film", cascade = CascadeType.ALL) 
private List<Inventory> inventories; 
+0

Я уже знаю это, чтобы преодолеть ленивую проблему загрузки. Я использовал фильтр openEntityManagerInView, чтобы диспетчер объектов оставался открытым в моих представлениях, также позволяя доступ к списку. Но кажется, что фильтр ничего не делает и не уверен, почему? – JCS

+0

Извините, я не знаком с фильтрующей функциональностью. Я понимаю, что он должен держать сессию открытой в представлении (jsp). Почему бы просто не сделать это нетерпеливо, если вы всегда используете это поле? Я думаю, фильтр неправильный. Что такое код фильтра? – Aviad

+0

Вы уверены, что называется bean "entityManagerFactory"? – Aviad

0

У меня такая же проблема. SecurityFilter имеет порядок фильтра по умолчанию -100, и именно по этой причине. Вы должны поместить openEntityManagerInViewFilter (какой порядок равен 0 или что-то в этом роде) до SecurityFilter (фильтр безопасности проверяет пользователя на роли и терпит неудачу). Попробуйте зарегистрировать фильтр с заказом = -101. Вы можете использовать либо свой подход с ServletContext или следующий я (просто вставить в любой фасоли с пометкой @Configuration аннотацию):

@Configuration 
public class WebConfig { 
@Bean 
    public FilterRegistrationBean openEntityManagerInViewFilterRegistration(SecurityProperties properties) { 

     FilterRegistrationBean registration = new FilterRegistrationBean(); 
     registration.setFilter(openEntityManagerInViewFilter()); 
     registration.addUrlPatterns("/*"); 
     registration.setOrder(properties.getFilterOrder()-1); 
     registration.setName("openEntityManagerInViewFilter"); 
     registration.setDispatcherTypes(DispatcherType.REQUEST, DispatcherType.ASYNC); 
     return registration; 
    } 

    @Bean(name = "openEntityManagerInViewFilter") 
    public OpenEntityManagerInViewFilter openEntityManagerInViewFilter() { 
     return new OpenEntityManagerInViewFilter(); 
    } 
} 

Главная точка входа (основной класс)

@Configuration 
@SpringBootApplication 
public class Application extends SpringBootServletInitializer { 

    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
     return application.sources(Application.class); 
    } 

    static final Logger log = LoggerFactory.getLogger(Application.class); 
    public static void main(String[] args) { 

     ConfigurableApplicationContext run = SpringApplication.run(Application.class); 
     log.info(Arrays.toString(run.getEnvironment().getActiveProfiles())); 
    } 

} 
+0

Пробовал это все еще не работает, удалил все мои вещи безопасности и, наконец, еще одну проблему. Вы используете FilterRegistrationBean, найденный в банке org.springframework.boot? Ниже импортируется я использую org.springframework.boot.context.embedded.FilterRegistrationBean – JCS

+0

Я использовал org.springframework.boot.context.embedded.FilterRegistrationBean. – fraer

+0

Попробуйте это как главную точку входа – fraer

0

You можно просто позвонить film.getInventories() где-нибудь в вашем сервисном слое @Transactional. Это дает вам больше контроля вместо жадной загрузки на уровне JPA:

@Service 
public class FilmService { 

    @Autowired 
    private FilmDao filmDao; 

    @Transactional 
    public Film getFilm(int filmId, boolean loadInventories) { 
     Film film = filmDao.getFilm(filmId); 
     if(loadInventories){ film.getInventories(); } 
     return film; 
    } 
} 

Поскольку нужно будет еще туда-обратно в БД я бы рекомендовал добавить кэширование.

Вы можете также добавить общие функции поля загрузки, как это:

@Transactional 
    public Film getFilm(int filmId, String[] propertiesToLoad) { 
     Film film = filmDao.getFilm(filmId); 
     BeanWrapper bw = new BeanWrapperImpl(item); 
     for (String propertyName : propertiesToLoad) { 
      bw.getPropertyValue(propertyName); 
     } 
     return film; 
    } 
Смежные вопросы