Jakarta ee 瓦丁:让CDI和ThreadLocal成为朋友

Jakarta ee 瓦丁:让CDI和ThreadLocal成为朋友,jakarta-ee,vaadin,cdi,Jakarta Ee,Vaadin,Cdi,使用ThreadLocal变量时,是否可以使用CDI的@Inject注释? 有一个片段: @VaadinScoped(VaadinScope.APPLICATION) public class AdminApplication extends AbstractCdiApplication implements HttpServletRequestListener { private static ThreadLocal<AdminApplication> threadLocal

使用ThreadLocal变量时,是否可以使用CDI的
@Inject
注释? 有一个片段:

@VaadinScoped(VaadinScope.APPLICATION)
 public class AdminApplication extends AbstractCdiApplication implements HttpServletRequestListener {

 private static ThreadLocal<AdminApplication> threadLocal = new ThreadLocal<AdminApplication>();

 @Inject
 private Instance<Lang> lang;

 @Override
 public void init() {
    setInstance(this);
    setLocale(Lang.RU_RU);
    setMainWindow(new LoginWindow());
 }

 @Override
 public final void setLocale(Locale locale) {
    getInstance().lang.get().setLocale(locale);
    super.setLocale(locale);
 }

    public static AdminApplication getInstance() {
    return threadLocal.get();
 }

 public static void setInstance(AdminApplication application) {
       threadLocal.set(application);
 }

 @Override
 public void onRequestStart(HttpServletRequest request, HttpServletResponse response)  {
    AdminApplication.setInstance(this);
 }
我通常会得到一个NullPointerException,因为
getInstance().lang.get()
为null

最重要的是:

@VaadinScoped(VaadinScope.APPLICATION)
public class Lang implements Serializable, TextBundle {...}
有趣的是,如果我使用
@EJB
注释,注入的EJB就在那里(不是null)。另一件事是
getInstance().lang
是默认实例(请参见调试中的这一点),但是当我调用
getInstance().lang.get()
时,它是空的


我尝试使用直接引用
@injectprivate Lang Lang,但带有HttpServletRequestListener的CDI附加组件似乎不适用于它。

最初使用“ThreadLocal模式”使HTTP请求数据和Vaadin应用程序实例可以轻松地供Vaadin应用程序的其余部分使用,而无需传递变量引用


也就是说,我认为如果使用CDI,没有任何ThreadLocal变量,您应该很好。只要在需要的地方使用requestScope和vaadScope变量即可

谢谢你的回答。我已经试过了,但似乎初始化/注入链的问题。。。
@VaadinScoped(VaadinScope.APPLICATION)
public class Lang implements Serializable, TextBundle {...}