Jakarta ee 瓦丁:让CDI和ThreadLocal成为朋友
使用ThreadLocal变量时,是否可以使用CDI的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
@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 {...}