3

この単純な Wicket ページは、GlassFish 3.1.2.2 サーバーでは完全に機能しますが、GlassFish 4.0 に展開すると機能しません。@Resource アノテーションを含まない他のページは完全に機能することに注意することが非常に重要です。

public class IndexPage extends WebPage {

  // this EJB injection works as expected
  @EJB(name = AnyManager.NAME)
  AnyManager anyMgr;

  // this JNDI Resource is defined as java.util.Properties at JNDI/Custom Resources of GlassFish admin console
  // this resource can be looked up using normal InitialContext.doLookup() method
  @Resource(name = "anyResource")
  Properties config;

  public IndexPage(final PageParameters p) {
    super(p);
  }
}

次の例外が発生します。


Last cause: org.apache.wicket.proxy.ILazyInitProxy not found by org.glassfish.hk2.external.cglib [27]
WicketMessage: Can't instantiate page using constructor 'public hu.app.IndexPage(org.apache.wicket.request.mapper.parameter.PageParameters)' and argument ''. An exception has been thrown during construction!

スタック トレースを参照してください (IndexPage コンストラクターの最初の行から開始)。


Root cause:

java.lang.ClassNotFoundException: org.apache.wicket.proxy.ILazyInitProxy not found by org.glassfish.hk2.external.cglib [27]
     at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1532)
     at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:75)
     at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1955)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
     at java.lang.ClassLoader.defineClass1(Native Method)
     at java.lang.ClassLoader.defineClass(ClassLoader.java:792)
     at java.lang.reflect.Method.invoke(Method.java:606)
     at net.sf.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:384)
     at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:219)
     at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
     at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:285)
     at org.apache.wicket.proxy.LazyInitProxyFactory.createProxy(LazyInitProxyFactory.java:190)
     at org.wicketstuff.javaee.injection.JavaEEProxyFieldValueFactory.getCachedProxy(JavaEEProxyFieldValueFactory.java:149)
     at org.wicketstuff.javaee.injection.JavaEEProxyFieldValueFactory.getFieldValue(JavaEEProxyFieldValueFactory.java:79)
     at org.apache.wicket.injection.Injector.inject(Injector.java:111)
     at org.wicketstuff.javaee.injection.JavaEEComponentInjector.inject(JavaEEComponentInjector.java:68)
     at org.wicketstuff.javaee.injection.JavaEEComponentInjector.onInstantiation(JavaEEComponentInjector.java:74)
     at org.apache.wicket.application.ComponentInstantiationListenerCollection$1.notify(ComponentInstantiationListenerCollection.java:38)
     at org.apache.wicket.application.ComponentInstantiationListenerCollection$1.notify(ComponentInstantiationListenerCollection.java:34)
     at org.apache.wicket.util.listener.ListenerCollection.notify(ListenerCollection.java:80)
     at org.apache.wicket.application.ComponentInstantiationListenerCollection.onInstantiation(ComponentInstantiationListenerCollection.java:33)
     at org.apache.wicket.Component.(Component.java:683)
     at org.apache.wicket.MarkupContainer.(MarkupContainer.java:121)
     at org.apache.wicket.Page.(Page.java:168)
     at org.apache.wicket.Page.(Page.java:132)
     at org.apache.wicket.markup.html.WebPage.(WebPage.java:76)
     at hu.app.IndexPage.(IndexPage.java:56)

多くの Google 検索を行った後、マネージャー Bean の 1 つでインジェクションを実行しようとする考えがあり、そのための単純なゲッターを定義しました。次の行を参照してください。

@Local
public interface AnyManager extends EntityManager {
  public static final String NAME = "ejb/AnyManager";
  Properties getConfig();
}

@Stateless(name = AnyManager.NAME)
public class AnyManagerImpl extends AbstractEntityManager implements AnyManager {

  @Resource(name = "iOIRConfig")
  Properties config;

  @Override
  public Properties getConfig() {
    return config;
  }
}

Wicket ページを次のように変更しました。

public class IndexPage extends WebPage {

  @EJB(name = AnyManager.NAME)
  AnyManager anyMgr;

  // so I have commented out
  // @Resource(name = "anyResource")
  Properties config;

  public IndexPage(final PageParameters p) {
    super(p);

    // and get the value from one of my EJB manager class
    config = anyMgr.getConfig();
  }
}

そして、これは私にとってはうまくいきます。私はこのタイプの解決策が好きではありません。私はまだ本当の説明と解決策を探しています。この問題を引き起こす GlassFish 4 で何が変更される可能性がありますか? GlassFish 3 では、この奇妙な効果はありません。

GlassFish 3 と GlassFish 4 の両方をクリーン インストールしました。

私のアプリケーションは、EJB.jar、WEBAPP.war、および共通の jar を共有する lib/ フォルダーを含む EAR アプリケーションです。EJB と WebApp が別のフォルダにあるため、これはクラスローダの問題である可能性があります。しかし、なぜ @EJB は機能し、@Resource は機能しないのでしょうか?

おそらく、Java EE 7 の実装の問題か、GlassFish 4 の単純なバグでしょうか?

どんな助けでもいいでしょう。

4

0 に答える 0