Jersey将支持与Google App Engine问题联系起来

时间:2012-09-12 17:39:34

标签: google-app-engine jersey hateoas

我没有设法使用泽西链接支持与Google App Engine,我在尝试访问该应用程序时遇到了这些异常:

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>

我还将jersey-server-linking-1.13.jar添加到我项目的WEB-INF / lib目录中。

我首先尝试添加el-api.jar,然后将juel-2.1.0.jar添加到WEB-INF / lib目录中,但我仍然遇到这些错误。

我想知道是否有人可以给我一些关于如何处理这个问题的提示。当我不使用Jersey连接jar时,一切都按预期工作。

4 个答案:

答案 0 :(得分:2)

我的GAE应用程序遇到了类似的问题。它与el-api和el-impl一起工作正常,但随着开发的进展,它开始要求de.odysseus.el.E​​xpressionFactoryImpl。我做了切换但是当我将JUEL添加到我的pom.xml时,我得到了与John Prince相同的错误(java.security.AccessControlException)。

GAE用户的解决方案是使用JUEL 2.2.7。

在撰写本文时,maven central中没有2.2.7。但是,您可以在

上找到它
<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

答案 1 :(得分:0)

问题是由于未找到de.odysseus.el.E​​xpressionFactoryImpl类。我将假设您已经将您提到的jar添加到WEB-INF \ lib文件夹中。

我建议您通过Project Explorer查看JAR文件,在Eclipse中简单展开它们,看看是否可以在你添加的ny个JAR文件中找到de.odysseus.el.E​​xpressionFactoryImpl类。

答案 2 :(得分:0)

我通过添加“juel”和“juel-impl”作为我项目的依赖项来“解决”这个问题(我们正在使用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不兼容。

答案 3 :(得分: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()

App Engine似乎已将JUEL定义为默认实现,但未提供相应的包。

为了解决这个问题,您需要(1)提供EL API和实施包,(2)使用上述方法之一来链接它。有关详细信息,请参阅https://stackoverflow.com/a/19814199/2099217