我想创建 Spring 请求拦截器,它可以从会话中获取一些数据,并在请求之前更改一些 @Autowired 组件。
我可以创建Interceptor并注册它,但它无法访问会话bean:
@Component
@Scope(value="session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class TokenInterceptor extends HandlerInterceptorAdapter {
@Autowired
private MyServicePerSession myServicePerSession;
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println(myServicePerSession.getName()); // NullPointerException!!!
return true;
}
}
在每个请求的 preHandle(...)方法的上方,我得到 NullPointerException 。
这是我的配置:
@Configuration
@EnableWebMvc
public class WebMvcConfig extends WebMvcConfigurerAdapter {
//...
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new TokenInterceptor());
}
}
除非注入 MyServicePerSession ,否则我说一切正常。
如果您能就此提出建议或解决该问题的其他方法,我将非常感激。
答案 0 :(得分:1)
您正在尝试设置一个新对象,但您必须设置一个spring bean。
new TokenInterceptor() // is not spring bean
@Autowired private TokenInterceptor tokenInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(tokenInterceptor);
// You have to set bean here
}
如果这不起作用,您可以查看http://docs.spring.io/spring-javaconfig/docs/1.0.0.M4/reference/html/ch04s02.html