2012-09-12 157 views
2

我沒使用與谷歌應用程序引擎的連接新澤西支持試圖訪問該應用程序時,我得到這些異常:新澤西鏈接支持

Caused by: javax.el.ELException: Could not find expression factory class 
... 
Caused by: java.lang.ClassNotFoundException: de.odysseus.el.ExpressionFactoryImpl 

中規定文檔,我把這個在web.xml的Jersey servlet外部分:

<init-param> 
<param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name> 
<param-value>com.sun.jersey.server.linking.LinkFilter</param-value> 
</init-param> 

我也球衣服務器聯-1.13.jar添加到WEB-INF/lib下我的項目目錄。

我想先加EL-api.jar文件,然後JUEL-2.1.0.jar到WEB-INF/lib目錄中,但我仍然得到這些錯誤。

我想知道是否有人可以給我一些關於如何處理這個問題的提示。當我不使用Jersey連接罐時,一切都按預期工作。

回答

0

問題是由於de.odysseus.el.E​​xpressionFactoryImpl類沒有被發現。我會假設你已經將jar添加到了WEB-INF \ lib文件夾中。

我建議你通過Project Explorer瀏覽JAR文件,在Eclipse中簡單地展開它們,看看是否可以在你添加的JAR文件的ny中找到de.odysseus.el.E​​xpressionFactoryImpl類。如果你正在做手工,你可能要搞清楚到底是什麼的;

0

我加入「JUEL」和「JUEL,實現了一套」爲我的項目的依賴(我們使用Maven的「解決」問題項目包含)。

但是,只要我做了,我開始一個不同的異常:

java.security.AccessControlException: access denied (java.io.FilePermission C:\Program Files (x86)\Java\jdk1.6.0_33\jre\lib\el.properties read) 
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374) 
    at java.security.AccessController.checkPermission(AccessController.java:546) 
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:532) 
    at com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkPermission(DevAppServerFactory.java:289) 
... 

我敢肯定,是因爲它的GAE限制相抵觸運行。

我在原來的ClassNotFound的異常,它試圖使用URLClassLoader的注意;我也想知道這個問題是否最終也是一個GAE問題。

在這一點上,澤西鏈接支持似乎與GAE不兼容。

2

我的GAE應用程序有類似的問題。它與el-api和el-impl一起工作良好,但隨着開發的進展,開始尋求de.odysseus.el.E​​xpressionFactoryImpl。我做了開關,但是當我將JUEL添加到我的pom.xml時,我得到了與John Prince(java.security.AccessControlException)相同的錯誤。

GAE用戶的解決方案是使用JUEL 2.2.7。

在寫這篇文章時,2.2.7在maven central中不可用。但是,你可以找到它的

<repository> 
    <id>repo-id</id> 
    <name>repo-name</name> 
    <url>https://oss.sonatype.org/content/repositories/snapshots/</url> 
</repository> 

,並鏈接與你所需要的任何

<dependency> 
    <groupId>de.odysseus.juel</groupId> 
    <artifactId>juel-api</artifactId> 
    <version>2.2.7-SNAPSHOT</version> 
</dependency> 

<dependency> 
    <groupId>de.odysseus.juel</groupId> 
    <artifactId>juel-impl</artifactId> 
    <version>2.2.7-SNAPSHOT</version> 
</dependency> 

<dependency> 
    <groupId>de.odysseus.juel</groupId> 
    <artifactId>juel-spi</artifactId> 
    <version>2.2.7-SNAPSHOT</version> 
</dependen 

來源:https://github.com/beckchr/juel/issues/73

+0

目前,juel的2.2.7版本可以在Maven中心版本中找到,如[here](https://github.com/beckchr/juel/)所示。 – Eric

0

這個問題(或者說是)由於在缺少實施統一表達語言。 EL API定義了一個靜態方法,用於查找ExpressionFactory類的實現。有很多種方法來定義的實現將用於:

  • 如果Services API(在JAR規範中詳述)。如果存在名爲META-INF/services/javax.el.E​​xpressionFactory的資源,則其第一行(如果存在)用作實現類的UTF-8編碼名稱。
  • 在JRE目錄中使用屬性文件「lib/el.properties」。如果此文件存在並且它可以通過java.util.Properties.load(InputStream)方法讀取,並且它包含鍵爲「javax.el.E​​xpressionFactory」的條目,則該條目的值將用作實現類。
  • 使用javax.el.E​​xpressionFactory系統屬性。如果定義了具有該名稱的系統屬性,則其值將用作實現類的名稱。
  • 使用平臺默認實現。

(來源:http://docs.oracle.com/javaee/7/api/javax/el/ExpressionFactory.html#newInstance()

應用程序引擎似乎已經定義爲JUEL默認實現,但不提供相應的軟件包。

爲了解決這個問題,就需要(1)提供EL API和實現包和(2)使用上述方法來將其鏈接之一。詳情請參閱https://stackoverflow.com/a/19814199/2099217