Spring Boot Request Scoped Bean

2.5k Views Asked by At

I am using spring boot for creating microservices. I need to implement request scope beans as I get some information in header and need this to be available across all the classes for that particular request. Below is what I did, but I get null pointer error.

@Component
@RequestScope(proxyMode = ScopedProxyMode.TARGET_CLASS)
public Class RequestHeaderInfo {
   private String appInfo;
   ...
}

@Component
public class RequestFilter implements Filter {
    @Autowired
    private RequestHeaderInfo requestHeaderInfo;
  
    public void doFilter(ServletRequest req,....) {
        HTTPServletRequest request = (HTTPServletRequest) req;
        requestHeaderInfo.setAppInfo(request.getHeader("appInfo"))   //throws null pointer error here
        ....
    }
}  

@Contoller
public class RestController {

    @Autowired
    private RequestHeaderInfo requestHeaderInfo;
}

I want this request header info object to be available throughout the particular request. In my filter class it throws null pointer error. Am I on the right track implementing request scoped bean?

1

There are 1 best solutions below

0
Arun Sudhakaran On

In our project (Spring boot multi-module and not microservices) we are using an Interceptor class to filter the request.

@Component
public class RequestInterceptor implements org.springframework.web.servlet.HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {

        String appInfo = request.getHeader("appInfo");
    }
    
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
        ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
        throws Exception {
    }
}

Plus our Bean with the request scope is configured like this

@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
@Component
public class RequestBean {

}

Hope this helps.