在GlassFish 4 @Resource注释上使用Wicket的JavaEE 6应用程序失败

时间:2013-10-16 06:17:30

标签: java-ee annotations glassfish

这个简单的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中进行注入 我为它定义了一个简单的getter。请参阅以下几行:

@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都安装了干净。

我的应用程序是一个EAR应用程序,它包含一个EJB.jar,WEBAPP.war和一个带有共享公共jar的lib /文件夹。 也许这是某种类加载器问题,因为EJB和WebApp位于不同的文件夹中? 但为什么@EJB有效而@Resource没有?

也许这是一个Java EE 7实现问题或GlassFish 4中的简单错误?

任何帮助都会很好。

0 个答案:

没有答案
相关问题