为了使这个会话范围的bean工作,它需要访问Request
对象以允许它确定登录用户的权限。
它还需要能够访问userService
- 另一个bean。
获取这些资源需要什么?
@Configuration
public class ExceptionResolverBuilder
{
@Bean @Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public ExceptionResolver getExceptionResolver()
{
ExceptionResolver er = new ExceptionResolver();
User user = userService.getLoggedInUser(request);
if(user.isAdmin())
{
sendEmail("Caught exception:" + exeption.getMessage());
}
else
{
writeLog("Caught exception:" + exeption.getMessage());
}
return er;
}
}
答案 0 :(得分:1)
相反令人讨厌的是,会话范围的bean无法轻松访问发起会话的请求。
但是,在您的情况下,您不需要。假设your ExceptionResolver
is an implementation of HandlerExceptionResolver
,则没有理由将您的记录逻辑放入ExceptionResolverBuilder.getExceptionResolver()
,因为解析器将通过HttpServletRequest
方法中的当前resolveException
传递。
另外,请考虑使用@ExceptionResolver
注释,这会让生活变得更轻松,还可以使用gets access to the current request。
答案 1 :(得分:0)
为了使这个会话范围的bean工作,它需要访问Request对象以允许它确定登录用户的权限。
AFAIK,如果当前请求已作为参数传递,或者通过本地线程传递,则只能获取当前请求。
如果您使用的是SpringSecurity,则可以通过调用SecurityContext.getContext()
来获取当前请求的身份验证信息。 (这通常使用本地线程。)但是,我不确定这是否可行,因为在未设置安全上下文时可能会调用您的方法。
它还需要能够访问userService - 另一个bean。
您需要安排这是由依赖注入提供的。
答案 2 :(得分:0)
对于定义为@Component
的bean,您可以像这样自动装配HttpServletRequest:
@Component
@Scope("session")
public class Foo {
@Autowired private HTTPServletRequest request;
//
}
但是,由于您使用@Bean
,因此无法执行此操作。
您可以按如下方式获取当前请求:
ServletRequestAttributes sra = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
HttpServletRequest req = sra.getRequest();
这使用了本地的线程本地。
如果您正在使用Spring MVC,那就是您所需要的一切。如果您没有使用Spring MVC,那么您需要在web.xml
中注册RequestContextListener或RequestContextFilter。