Java 在HandlerInterceptor上启用hibernate筛选器

Java 在HandlerInterceptor上启用hibernate筛选器,java,spring,hibernate,spring-boot,Java,Spring,Hibernate,Spring Boot,我有如下hibernate筛选器: @Entity @FilterDef(name = "filter_name", parameters = { @ParamDef(name = "tenatId", type = "long") }) @Filter(name = "filter_name", condition = "tenant_id = :tenantId") public class MyEntity { private long tenantId; } @Configu

我有如下hibernate筛选器:

@Entity
@FilterDef(name = "filter_name", parameters = { @ParamDef(name = "tenatId", type = "long") })
@Filter(name = "filter_name", condition = "tenant_id = :tenantId")
public class MyEntity {

   private long tenantId;

}
@Configuration
public class RequestInterceptor implements HandlerInterceptorAdapter {

    @PersistenceContext
    private EntityManager entityManager;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
        Object handler) throws Exception {
        Filter filter = entityManager.unwrap(Session.class).enableFilter("filter_name");
        filter.setParameter("tenantId", myService.getTentantId());
    }
}
我想在每次请求出现时启用此过滤器,因此我创建请求拦截器,如下所示:

@Entity
@FilterDef(name = "filter_name", parameters = { @ParamDef(name = "tenatId", type = "long") })
@Filter(name = "filter_name", condition = "tenant_id = :tenantId")
public class MyEntity {

   private long tenantId;

}
@Configuration
public class RequestInterceptor implements HandlerInterceptorAdapter {

    @PersistenceContext
    private EntityManager entityManager;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
        Object handler) throws Exception {
        Filter filter = entityManager.unwrap(Session.class).enableFilter("filter_name");
        filter.setParameter("tenantId", myService.getTentantId());
    }
}
但我无法访问事务管理器,出现错误:

java.lang.IllegalStateException: No transactional EntityManager available
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:272)
    at com.sun.proxy.$Proxy184.unwrap(Unknown Source)
    at id.gdplabs.koi.api.config.security.RequestInterceptor.preHandle(RequestInterceptor.java:27)
    at org.springframework.web.servlet.handler.WebRequestHandlerInterceptorAdapter.preHandle(WebRequestHandlerInterceptorAdapter.java:56)
    at org.springframework.web.servlet.HandlerExecutionChain.applyPreHandle(HandlerExecutionChain.java:134)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:958)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
...
如果我将代码移动到控制器,它会工作:

@RequestMapping(method = RequestMethod.GET, value = "/test")
public List<MyEntity> test() {
    Filter filter = entityManager.unwrap(Session.class).enableFilter("filter_name");
    filter.setParameter("tenantId", myService.getTentantId());
    return myService.findAll();
}
@RequestMapping(method=RequestMethod.GET,value=“/test”)
公共列表测试(){
Filter Filter=entityManager.unwrap(Session.class).enableFilter(“Filter_name”);
setParameter(“tenantId”,myService.getTentantId());
返回myService.findAll();
}
你知道为什么我不能在拦截器中打开hibernate会话吗

欢迎任何建议,谢谢