コードの重複を減らすために、いくつかのクラスと 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)