小编Nic*_*lie的帖子

在 HandlerInterceptor 上启用休眠过滤器

我有这样的休眠过滤器:

@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;

}
Run Code Online (Sandbox Code Playgroud)

我想在每次请求到来时启用这个过滤器,所以我创建了这样的请求拦截器:

@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());
    }
}
Run Code Online (Sandbox Code Playgroud)

但我无法使用事务管理器,出现错误:

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) …
Run Code Online (Sandbox Code Playgroud)

java spring hibernate spring-boot

5
推荐指数
0
解决办法
678
查看次数

标签 统计

hibernate ×1

java ×1

spring ×1

spring-boot ×1