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

标签 java spring spring-boot spring-data-jpa servlet-filters

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

相关文章:

java - 将 arraylist 值绑定(bind)到 JSP 下拉列表

java - Eclipse合并两个java项目

java - 第二个带注释的方面未被调用

java - Springboot ErrorPageFilter 问题

java - 如何以 Thymeleaf 形式显示嵌套对象值

java - 如何使用 REST API 解析具有特定标记服务器的现有 XML 文档

JAVA_HOME 未正确定义(仅来自 jenkins)

Java 故障?减数?

java.lang.IllegalArgumentException : The character [_] is never valid in a domain name

java - 持久化实体时出现 NullPointerException