0

コードの重複を減らすために、いくつかのクラスと Bean を共有できる可能性のある 2 つの Web jsf プロジェクトがあります。

1 つは、潜在的な JNDI-ServiceLocator アプリケーション スコープ Bean です。(両方の Web プロジェクトが同じホストから RemoteBeans にアクセスします)

JNDI - ServiceLocator Bean:

@ManagedBean(name = "jndiServiceLocatorBean")
@ApplicationScoped
public class JndiServiceLocatorBean implements Serializable
{
    // code to cache jndi references
}

ManagedProperty として Bean を持つ抽象クラス:

public abstract class AJndiServiceLocator
{
    @ManagedProperty(value = "#{jndiServiceLocatorBean}")
    protected JndiServiceLocatorBean jndiServiceLocatorBean = null;

    public void setJndiServiceLocatorBean(final JndiServiceLocatorBean jndiServiceLocatorBean)
    {
        this.jndiServiceLocatorBean = jndiServiceLocatorBean;
    }
}

プロジェクトの 1 つからの Bean の例:

@ManagedBean(name = "testBean")
@ApplicationScoped
public class TestBean extends AJndiServiceLocator implements Serializable
{
    // bean code - can now retrieve remote bean interfaces 
    // from super class
}

JndiServiceLocatorBean最初のクラスとクラスAJndiServiceLocatorがプロジェクトのソース フォルダーにある 場合、このコードは期待どおりに機能します。

しかし、これら 2 つのクラスを両方の Web プロジェクトで共有されるサブプロジェクトに外部委託すると、うまくいきません。(ビルド パスに含まれ、展開エントリとしてマークされます。)

発生するインジェクション例外:

Schwerwiegend: Error Rendering View[/index.xhtml]
com.sun.faces.mgbean.ManagedBeanCreationException: Bei der Ressourcen-Einspeisung auf dem verwalteten Bean appBean ist ein Fehler aufgetreten.
    at com.sun.faces.mgbean.BeanBuilder.invokePostConstruct(BeanBuilder.java:229)
    at com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:105)
    at com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:409)
    at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:269)
    at com.sun.faces.el.ManagedBeanELResolver.resolveBean(ManagedBeanELResolver.java:244)
    at com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:116)
    at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
    at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
4

1 に答える 1

0

JSF は、JSF アーティファクトのクラスパス全体のすべての JAR をスキャンしません。これは、数十の JAR を持つ大規模な Web アプリケーションでは非常に高価な仕事でした。JSF は、JSF 2.0 互換ファイル/WEB-INF/libを含むフォルダー内のJAR のみをスキャンします。/META-INF/faces-config.xml

JAR がこれに準拠していることを確認してください。

  • にある必要があります/WEB-INF/lib
  • /META-INF/faces-config.xmlJSF 2.0 互換のルート宣言を持つ必要があります。

以下も参照してください。

于 2012-10-01T11:22:36.847 に答える