在filter中访问spring boot数据jpa实体

目前我正在尝试将基于servlet的应用程序转换为带控制器的spring启动应用程序。 设置filter后,我在访问实体函数时遇到“无法初始化代理 – 无会话”-Exception。 (这里:用户方法“isAdmin”)。

我设置了这样的filter:

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以将filter注册到“/ admin”:

 @Configuration public class SpringConfiguration { @Bean public FilterRegistrationBean adminRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new AdminFilter()); registration.addUrlPatterns("/admin/*"); return registration; } } 

自动assembly支持由以下语句启用:

 SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, filterConfig.getServletContext()); 

我尝试将@Transactional添加到方法中,并添加了OpenSessionInViewFilter – 但没有成功。

在我的Controller-Beans(@Controller)中,我可以访问从自动assembly的存储库中检索到的实体的function而没有任何问题。

该函数只返回用户实体的值:

 public boolean isAdmin() { return admin; } 

任何想法为什么我收到错误以及如何解决它?

stracktrace cut:

 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] 

问候

gemorra

该死的。 尝试使用userRepository.find(id),一切正常。

使用getOne,您将获得对仅包含id的实体的引用(用于存在检查或类似)。

CrudRepository findOne()和JpaRepository getOne()之间的区别