@Inject
ThreadLocal 変数を操作するときにCDI の注釈を使用することは可能ですか? スニペットがあります:
@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);
}
これらのメソッドを呼び出そうとすると:
public void authenticate(String login, String password) throws Exception {
if ("user".equals(login) && "querty".equals(password)) {
loadProtectedResources();
return;
}
throw new Exception("Login failed!");
}
private void loadProtectedResources() {
String mainWindowCaption = getInstance().lang.get().getText("mainwindow-name");
setMainWindow(new Window(mainWindowCaption));
}
私は通常 NullPointerException を取得しますが、これgetInstance().lang.get()
はnullです。
ラングは:
@VaadinScoped(VaadinScope.APPLICATION)
public class Lang implements Serializable, TextBundle {...}
興味深いことに、@EJB
注釈を使用すると、注入された ejb が存在します (null ではありません)。もう 1 つgetInstance().lang
は、既定のインスタンス (デバッグでこれを参照) ですが、呼び出すgetInstance().lang.get()
と null になります。
私は直接参照を使用しようとしました@Inject private Lang lang;
が、HttpServletRequestListener を使用した CDI アドオンは機能しないようです。