目前,我正在尝试将基于 servlet 的应用程序转换为带有 Controller 的 Spring Boot 应用程序。设置过滤器后,在访问实体函数时遇到“无法初始化代理 - 无 session ”异常。 (此处:用户方法“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接口(interface),并在@Configuration标记的类中添加了Filter,以将过滤器注册到“/admin”:
@Configuration
public class SpringConfiguration {
@Bean
public FilterRegistrationBean adminRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new AdminFilter());
registration.addUrlPatterns("/admin/*");
return registration;
}
}
Autowiring 支持通过以下语句启用:
SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this,
filterConfig.getServletContext());
我尝试将 @Transactional 添加到该方法中,并且还添加了 OpenSessionInViewFilter - 但没有成功。
在我的 Controller-Beans (@Controller) 中,我可以毫无问题地访问从 Autowiring 存储库检索的实体的功能。
该函数仅从用户实体返回一个值:
public boolean isAdmin() {
return admin;
}
有什么想法为什么我会收到错误以及如何修复它吗?
stracktrace 剪辑:
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 的实体的引用(用于存在性检查或类似)。
Difference between CrudRepository findOne() and JpaRepository getOne()
关于java - 访问过滤器中的spring boot数据jpa实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39878477/