Lately, I've come to know that RequestScoped beans are not usable outside a web transaction.
The problem is that outside the web transaction I do not want to use that bean, instead of having an error.
How could I achieve this ?
The component using the request scoped bean :
@Component
public class JavaComponent {
@Autowired
private RequestScopedBean requestScopedBean;
@Override
public void doStuff() {
// TODO if in web transaction, use RequestScopedBean , otherwhise don't
}
}
The bean:
@Component
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class RequestScopedBean {
public String getInfo() {
return "information about the web transaction";
}
}
EDIT: the error I get when trying to use the JavaComponent outside the web request is :
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'JavaComponent.requestScopedBean': Scope 'request' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.
The way I use the bean while outside the web request thread is by having @Async methods running in separated threads.