[英]Accessing spring boot data jpa entity in filter
目前,我正在尝试将基于 servlet 的应用程序转换为带有控制器的 Spring Boot 应用程序。 设置过滤器后,在访问实体函数时遇到“无法初始化代理 - 无会话”异常。 (此处:用户方法“isAdmin”)。
我设置了一个这样的过滤器:
public class AdminFilter implements Filter {
@Autowired
UserRepository userRepository;
@Override
@Transactional
public void doFilter(ServletRequest aRequest, ServletResponse aResponse, FilterChain aFilterChain)
throws IOException, ServletException {
User u = userRepository.getOne(5l).orElse(null);
System.out.println(u.isAdmin());
aFilterChain.doFilter(aRequest, aResponse);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this,
filterConfig.getServletContext());
}
@Override
public void destroy() {
}
}
实现了Filter接口,并在@Configuration标记的类中添加了Filter,以将过滤器注册到“/admin”:
@Configuration
public class SpringConfiguration {
@Bean
public FilterRegistrationBean adminRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new AdminFilter());
registration.addUrlPatterns("/admin/*");
return registration;
}
}
自动装配支持通过以下语句启用:
SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this,
filterConfig.getServletContext());
我尝试将 @Transactional 添加到方法中,并添加了 OpenSessionInViewFilter - 没有成功。
在我的 Controller-Beans (@Controller) 中,我可以毫无问题地访问从自动装配的存储库中检索到的实体的功能。
该函数仅从用户实体返回一个值:
public boolean isAdmin() {
return admin;
}
任何想法为什么我收到错误以及如何解决它?
一个跟踪切割:
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:148) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:266) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:73) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at de.seeme.web.persistence.User_$$_jvst43d_a.isAdmin(User_$$_jvst43d_a.java) ~[bin/:na]
你好
杰莫拉
该死。 用 userRepository.find(id) 试了一下,一切正常。
使用 getOne,您将只获得对仅包含 id 的实体的引用(用于存在检查或类似)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.