0

@InjectThreadLocal 変数を操作するときに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 アドオンは機能しないようです。

4

1 に答える 1

0

「ThreadLocalパターン」は元々、変数参照を渡すことなく、HTTPリクエストデータとVaadinアプリケーションインスタンスを残りのVaadinアプリケーションで簡単に利用できるようにするために使用されていました。

そうは言っても、CDIを使用している場合は、ThreadLocal変数がなくても問題ないと思います。RequestScoped変数とVaadinScoped変数は、必要な場所で使用するだけです。

于 2012-09-25T07:50:16.130 に答える