我使用Spring Boot 2创建了Java 8 rest API。可以使用自定义注释@DataAware
对控制器端点进行注释。有一个HandlerInterceptor处于活动状态,它检查当前请求是否映射到具有此批注的方法。如果是这样,我希望拦截器解析请求的特定标头,并使结果对象在处理该请求的整个线程中可用。
例如:
@DataAware
注释DataInterceptor
将解析标头,然后
创建一个对象列表parsedData =“ a”,“ b”和“ c”。DataInterceptor
的作用类似于
ThreadForThisRequest.addProperty("data",myParsedData);
我想为此目的使用MDC(映射的诊断上下文),但似乎是一种反模式,用于将数据存储在相对隐藏的“全局”上下文映射中。
我不喜欢请求属性,因为那样的话,我必须将请求对象传递到应用程序中的所有位置。对看起来像“ public static final XXX”的东西进行编程要容易得多,但实际上只限于该请求(线程)。
我偶然发现ThreadLocal,并希望确保它能够完成我认为的工作。如果我介绍以下字段:
public static ThreadLocal<List<String>> requestSpecificData
然后,每当我的应用程序使用此对象时,将仅给出THAT请求的数据,因为每个请求均由其自己的线程处理? Spring Web或Spring Boot的嵌入式Tomcat是否会对线程进行其他一些古怪的事情或将请求转发到(向其他线程?),以便我的控制器端点可能丢失数据或看到以前的请求数据而不是自己的请求数据?