gpt4 book ai didi

java - 访问过滤器中的spring boot数据jpa实体

转载 作者:行者123 更新时间:2023-11-30 07:07:14 26 4
gpt4 key购买 nike

目前,我正在尝试将基于 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com