Spring: выдается исключение Catch из AccessDecisionManager - НЕ из контроллера

Использование Spring (4.2.4) с MVC (4.2.4) и Security (4.0.3). Я реализовал AccessDecisionManager, и в моем методе решения я выбрасываю исключение:

public void decide(
    Authentication authentication, 
    Object object,
    Collection<ConfigAttribute> configAttributes
)   throws AccessDeniedException, InsufficientAuthenticationException {
        FilterInvocation fi = (FilterInvocation) object;
        String requestUrl = fi.getRequestUrl();
    ...
    throw new SessionCompanyNotRoleTableCompanyException(1, 2);
    ...
    throw new AccessDeniedException("Access denied!");
}

Я не могу ни поймать ниSessionCompanyNotRoleTableCompanyException"ни AccessDeniedException, Я попытался использовать глобальный обработчик исключений:

@Component
@ControllerAdvice
public class GlobalExceptionHandler {
private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);

@ExceptionHandler(SessionCompanyNotRoleTableCompanyException.class)
public ModelAndView sessionCompanyNotRoleTableCompany() {
    log.debug("SessionCompanyNotRoleTableCompanyException captured in GlobalExceptionHandler");
    String reason = "Reason: SessionCompanyNotRoleTableCompanyException";
    ModelAndView mav = new ModelAndView();
    mav.addObject("reason", reason);
    mav.setViewName("error.html");
    return mav;             
}

@ExceptionHandler(Exception.class)
public ModelAndView exception(ModelMap model) {
    log.debug("Exception captured in GlobalExceptionHandler");
    String reason = "General Exception";
    ModelAndView mav = new ModelAndView();
    mav.addObject("reason", reason);
    mav.setViewName("error.html");
    return mav;             
}
}

Я даже создал ExceptionResolver-классы, такие как:

@Component
public class SessionCompanyNotRoleTableCompanyExceptionResolver implements HandlerExceptionResolver, Ordered {

    private static final Logger log = LoggerFactory.getLogger(SessionCompanyNotRoleTableCompanyExceptionResolver.class);

    private int order;

    @Override
    public ModelAndView resolveException(
        HttpServletRequest request, 
        HttpServletResponse response, 
        Object handler,
        Exception ex
    ) {
        if (ex instanceof SessionCompanyNotRoleTableCompanyException) {
            log.debug("SessionCompanyNotRoleTableCompanyException captured in SessionCompanyNotRoleTableCompanyExceptionResolver");
            String reason = "Reason: SessionCompanyNotRoleTableCompanyException";
            ModelAndView mav = new ModelAndView();
            mav.addObject("reason", reason);
            mav.setViewName("error.html");
            return mav;             
        }
        return null;
    }

    @Override
    public int getOrder() {
        return order;
    }

    public void setOrder(int order) {
        this.order = order;
    }

}

... и инициализировать их в моем web-config-классе, например:

@Bean
public SessionCompanyNotRoleTableCompanyExceptionResolver createSessionCompanyNotRoleTableCompanyExceptionResolver() {
    SessionCompanyNotRoleTableCompanyExceptionResolver resolver = new SessionCompanyNotRoleTableCompanyExceptionResolver();
    resolver.setOrder(1);
    return resolver;
}

Эти работы, т.е. исключения регистрируются ТОЛЬКО ЕСЛИ они выбрасываются из контроллеров. Но не из моего decide-метод в AccessDecisionManager,

Что и как я должен реализовать что-то, что может поймать их вне (до) контроллера?

РЕДАКТИРОВАТЬ (добавив SessionCompanyNotRoleTableCompanyException показать вам свое определение):

public class SessionCompanyNotRoleTableCompanyException extends RuntimeException {

    private static final long serialVersionUID = 1L;

    public SessionCompanyNotRoleTableCompanyException(Long contextCompanyId, Long tableId) {
        super("Context companyId: " + contextCompanyId + ", tableId: " + tableId);
    }

}

0 ответов

Другие вопросы по тегам