方面

时间:2017-07-25 12:15:22

标签: java spring hibernate aop aspectj

我正在尝试访问aspectj @Aspect中的会话属性。 当我这样做时,我有例外。

java.lang.IllegalStateException:找不到线程绑定请求:您是指实际Web请求之外的请求属性,还是处理最初接收线程之外的请求?如果您实际上是在Web请求中操作并仍然收到此消息,则您的代码可能在DispatcherServlet / DispatcherPortlet之外运行:在这种情况下,请使用RequestContextListener或RequestContextFilter来公开当前请求。

@Aspect
@Component
public class GlobalFilter {

@Autowired
private EntityManager entityManager;

private static HttpSession httpSession() {
    ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
    return attr.getRequest().getSession(true);
}

@Before("execution(public !void org.springframework.data.repository.Repository+.find*(..))")
public void beforeFind() {
    HttpSession httpSession = httpSession();

    Long idClient = (Long) httpSession.getAttribute(SessionKeys.ID_CLIENT);
    Long idUser = (Long) httpSession.getAttribute(SessionKeys.ID_USER);

    if (idClient != null) {

        enableFilter(DatabaseFilter.ID_USER, DatabaseFilter.ID_USER_PARAM_NAME, idUser);
        enableFilter(DatabaseFilter.ID_CLIENT, DatabaseFilter.ID_CLIENT_PARAM_NAME, idClient);
        enableFilter(DatabaseFilter.ID_CLIENT_BY_USER, DatabaseFilter.ID_CLIENT_PARAM_NAME, idClient);
    }
}

private void enableFilter(String filterName, String filterParamName, Long filterValue) {
    Filter filterUser = entityManager.unwrap(Session.class).enableFilter(filterName);
    filterUser.setParameter(filterParamName, filterValue);
}
}

我也试着像这样注入会话:

@Autowired
private EntityManager entityManager;

似乎HttpSession和我的方面没有在引起问题的同一个线程中执行。

所以我有两个问题: - 有没有办法获得方面的会话信息?怎么样?

  • 如果我只是忽略异常,如果两个用户同时使用该应用程序,这会是一个问题吗?我的方面线程是安全的还是两个会话在这个方面混淆了?

我正在使用春季靴子。

提前谢谢。

0 个答案:

没有答案