我没有设法使用泽西链接支持与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时,一切都按预期工作。
答案 0 :(得分:2)
我的GAE应用程序遇到了类似的问题。它与el-api和el-impl一起工作正常,但随着开发的进展,它开始要求de.odysseus.el.ExpressionFactoryImpl。我做了切换但是当我将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
答案 1 :(得分:0)
问题是由于未找到de.odysseus.el.ExpressionFactoryImpl类。我将假设您已经将您提到的jar添加到WEB-INF \ lib文件夹中。
我建议您通过Project Explorer查看JAR文件,在Eclipse中简单展开它们,看看是否可以在你添加的ny个JAR文件中找到de.odysseus.el.ExpressionFactoryImpl类。
答案 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.ExpressionFactory的资源,则其第一行(如果存在)将用作实现类的UTF-8编码名称。
- 使用JRE目录中的属性文件“lib / el.properties”。如果此文件存在且java.util.Properties.load(InputStream)方法可读,并且它包含一个键为“javax.el.ExpressionFactory”的条目,则该条目的值将用作名称实施类。
- 使用javax.el.ExpressionFactory系统属性。如果定义了具有此名称的系统属性,则其值将用作实现类的名称。
- 使用平台默认实施。
(资料来源: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。