Google app engine Jersey链接支持与Google应用程序引擎问题

Google app engine Jersey链接支持与Google应用程序引擎问题,google-app-engine,jersey,hateoas,Google App Engine,Jersey,Hateoas,我没有使用Google App Engine的Jersey链接支持,我在尝试访问应用程序时遇到以下异常: Caused by: javax.el.ELException: Could not find expression factory class ... Caused by: java.lang.ClassNotFoundException: de.odysseus.el.ExpressionFactoryImpl 如文档中所述,我将其放在web.xml的Jersey servlet部分:

我没有使用Google App Engine的Jersey链接支持,我在尝试访问应用程序时遇到以下异常:

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>

com.sun.jersey.spi.container.ContainerResponseFilters
com.sun.jersey.server.linking.LinkFilter
我还将jersey-server-linking-1.13.jar添加到项目的WEB-INF/lib目录中

我试图先添加el-api.jar,然后再将juel-2.1.0.jar添加到WEB-INF/lib目录,但仍然出现这些错误


我想知道是否有人能给我一些关于如何处理这件事的提示。当我不使用Jersey链接jar时,一切正常。

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

我建议您通过项目资源管理器查看JAR文件,在Eclipse中简单地展开它们,看看是否可以在您添加的JAR文件的ny中找到de.odysseus.el.ExpressionFactoryImpl类。

我通过添加“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不兼容。

我的GAE应用程序也有类似的问题。它与el api和el impl配合使用很好,但随着开发的进行,开始要求使用de.odysseus.el.ExpressionFactoryImpl。我做出了切换,但当我将JUEL添加到pom.xml中时,我遇到了与John Princ相同的错误e(java.security.AccessControlException)

GAE用户的解决方案是使用Juel2.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>

回购id
回购协议名称
https://oss.sonatype.org/content/repositories/snapshots/
和你需要的任何东西联系起来

<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

奥德修斯·尤尔

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

  • 使用服务API(详见JAR规范)。如果存在名为META-INF/Services/javax.el.ExpressionFactory的资源,则其第一行(如果存在)将用作实现类的UTF-8编码名称
  • 使用JRE目录中的属性文件“lib/el.properties”。如果该文件存在并且可由java.util.properties.load(InputStream)方法读取,并且它包含一个键为“javax.el.ExpressionFactory”的条目,则该条目的值将用作实现类的名称
  • 使用javax.el.ExpressionFactory系统属性。如果定义了具有此名称的系统属性,则其值将用作实现类的名称
  • 使用平台默认实现
(来源:)

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


为了解决这个问题,您需要(1)提供EL API和实现包,并(2)使用上述方法之一链接它。有关详细信息,请参阅。

目前,Maven central Repositoy上提供了juel的2.2.7版,如图所示。