2

我没有设法将 Jersey 链接支持与 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

4 回答 4

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

于 2013-09-19T22:01:38.480 回答
0

这个问题是(或者更确切地说是)由于缺少统一表达式语言的实现。EL API 定义了一个静态方法来查找ExpressionFactory类的实现。有多种方法可以定义要使用的实现:

  • 使用服务 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

于 2013-11-06T14:22:27.270 回答
0

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

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

于 2012-09-12T17:50:22.760 回答
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 问题。

此时,Jersey 链接支持似乎与 GAE 不兼容。

于 2012-10-01T20:25:14.120 回答