1. ホーム
  2. jsf

[解決済み] サーブレット関連クラスでJSFマネージドBeanを名前付きで取得する

2022-12-22 12:22:58

質問

カスタムサーブレット(AJAX/JSON用)を作成しようとしています。 @ManagedBeans を名前で参照したいのです。私はマッピングすることを望んでいます。

http://host/app/myBean/myProperty

になります。

@ManagedBean(name="myBean")
public class MyBean {
    public String getMyProperty();
}

通常のサーブレットから名前でBeanをロードすることは可能でしょうか?そのために使えるJSFサーブレットやヘルパーはありますか?

私は、これらすべてがあまりにも明白であるSpringに甘えているようです。

どのように解決するのですか?

サーブレットベースのアーティファクトで、例えば @WebServlet , @WebFilter@WebListener を使えば、JSFの @ManagedBean @RequestScoped によるものです。

Bean bean = (Bean) request.getAttribute("beanName");

@ManagedBean @SessionScoped によって

Bean bean = (Bean) request.getSession().getAttribute("beanName");

@ManagedBean @ApplicationScoped によって

Bean bean = (Bean) getServletContext().getAttribute("beanName");

これは、ビーンがあらかじめJSFによって自動作成されていることが前提であることに注意してください。そうでない場合、これらは null . その後、手動でビーンを作成して setAttribute("beanName", bean) .


CDIを使用できるようになった場合 @Named の代わりに、JSF 2.3 で非推奨となった @ManagedBean の代わりにを使えば、手動でビーンを作成する必要がなくなるので、より簡単になります。

@Inject
private Bean bean;

を使っているときはうまくいかないことに注意してください。 @Named @ViewScoped なぜなら、Bean は JSF のビューの状態によってのみ識別可能であり、それは FacesServlet が呼び出されたときにのみ利用可能だからです。そのため、その前に実行されるフィルタでは、ビーンにアクセスする際に @Inject ed @ViewScoped は常に ContextNotActiveException .


中にいるときだけ @ManagedBean の中にいるときだけです。 @ManagedProperty :

@ManagedProperty("#{bean}")
private Bean bean;

の中では動作しないことに注意してください。 @Named または @WebServlet または他のアーティファクト。実際に動作するのは @ManagedBean の中だけで動作します。


の中に入っていない場合は @ManagedBean の中ではなく FacesContext は容易に利用できる(つまり FacesContext#getCurrentInstance() が返さない null を返さない)、また Application#evaluateExpressionGet() :

FacesContext context = FacesContext.getCurrentInstance();
Bean bean = context.getApplication().evaluateExpressionGet(context, "#{beanName}", Bean.class);

であり,次のように簡略化することができる.

@SuppressWarnings("unchecked")
public static <T> T findBean(String beanName) {
    FacesContext context = FacesContext.getCurrentInstance();
    return (T) context.getApplication().evaluateExpressionGet(context, "#{" + beanName + "}", Object.class);
}

であり、以下のように使用することができる。

Bean bean = findBean("bean");


こちらもご覧ください。