1

JSF は Java の世界で非常に人気のあるテクノロジですが、Spring との連携は依然として困難であり、「厄介な」ハックが必要です。私は現在、この「ハック」の 1 つに問題があります。

Spring サービスは を使用して注入されますSpringBeanFacesELResolver。で構成されていますfaces-config.xml

<application>
    <el-resolver>
        org.springframework.web.jsf.el.SpringBeanFacesELResolver
    </el-resolver>
</application>

Spring サービスの注入は非常に醜いですが、機能しています。

@ManagedProperty(value="#{customerService}")
CustomerService customerService;

しかし、問題があります。JSF では、マネージド Bean がシリアライズ可能である必要があります。つまり、Spring サービスもシリアル化可能である必要があるか、フィールドが一時的である必要があります。フィールドが一時的な場合、注入は機能しません (そのフィールドに null があります)。また、Spring サービスをシリアライズ可能にすることは、私の意見では良い考えではなく、潜在的なパフォーマンスの問題です。すべて Spring サービスに注入される Hibernate コンテキスト、データ ソースはどうなるでしょうか?

では、JSF マネージド Bean で Spring サービスを使用するための、正しくて痛みの少ない方法は何ですか?

4

1 に答える 1

1

org.springframework.web.jsf.el.SpringBeanFacesELResolver でも多くの問題を経験しました。ほとんどの場合、オブジェクト スコープの不一致に関連しています (Spring には、JSF のビュー スコープと会話スコープに相当するものはありません)。シリアル化の問題について不満を言う人もいます。

この記事で提案されているソリューションをうまく適用しました: http://www.beyondjava.net/blog/integrate-jsf-2-spring-3-nicely/

私の場合、シリアライゼーションは問題ではなく、Bean スコープだけに関心がありました。Spring Bean のライフサイクルに干渉することなく、JSF がバッキング Bean のライフサイクルを完全に管理することを望みました。

JSF マネージド Bean を作成して Spring コンテキストをロードし、JSF コンテキストから Spring マネージド Bean にアクセスするように自分自身を自動配線しました。

次の JSF Bean スーパークラスを開発しました。

public abstract class AutowireableManagedBean {

    protected AutowireCapableBeanFactory ctx;

    @PostConstruct
    protected void init() {
        logger.debug("init");
        ctx = WebApplicationContextUtils
                .getWebApplicationContext(
                        (ServletContext) FacesContext.getCurrentInstance()
                                .getExternalContext().getContext())
                .getAutowireCapableBeanFactory();
        // The following line does the magic
        ctx.autowireBean(this);
    }
   ...
}

次に、具体的な JSF バッキング Bean は次のようになりました (問題なくビュー スコープを使用できました)。

@ManagedBean
@ViewScoped
public class MyBackingBean extends AutowireableManagedBean {

    @Autowired
    private MyDao myDao;
于 2015-08-12T01:03:34.803 に答える