如何在Google App Engine中创建javax.el.E​​xpressionFactory以使用Hibernate Validator

时间:2018-11-18 21:08:56

标签: java google-app-engine google-cloud-platform

我正尝试在needs javax.el的Google App Engine应用上升级到休眠验证器版本6,因此我在自己的依赖项中添加了org.glassfish:javax.el:jar:3.0.1-b10

但是,不使用它:

在本地开发环境中,我可以使用ExpressionFactory创建一个新的ExpressionFactory.newInstance()ExpressionFactory来自本地Jetty安装jetty93/jetty-distribution/lib/apache-jsp/org.mortbay.jasper.apache-el-8.0.33.jar,它从同一jar返回实现org.apache.el.ExpressionFactoryImpl

在已部署的GAE环境中,ExpressionFactory来自java8_runtime/runtime-shared.jar!/javax/el/ExpressionFactory.class,但是即使存在ExpressionFactory.newInstance()org.apache.el.ExpressionFactoryImpl仍尝试获取com.sun.el.ExpressionFactoryImpl。 / p>

在两种环境中,我都可以从com.sun.el.ExpressionFactoryImpl手动加载WEB-INF/lib/javax.el-3.0.1-b10.jar,因此它存在于类路径中:

final Constructor<ExpressionFactoryImpl> constructor = com.sun.el.ExpressionFactoryImpl.class.getConstructor();
final ExpressionFactoryImpl expressionFactory = constructor.newInstance();
  • 为什么即使引用实现org.apache.el.ExpressionFactoryImpl在类路径上,GAE环境仍然如此热衷于加载com.sun.el.ExpressionFactoryImpl
  • 如何使GAE加载现有的ExpressionFactoryImpl,以便创建休眠的ValidatorFactory?我是否必须手动提供MessageInterpolator才能提供正确的ExpressionFactoryImpl

1 个答案:

答案 0 :(得分:1)

我终于通过将系统属性添加到appengine-web.xml中来解决了这个问题:

<system-properties>
    <property name="javax.el.ExpressionFactory" value="com.sun.el.ExpressionFactoryImpl" />
</system-properties>

另一种可能性是添加文件“ META-INF / services / javax.el.E​​xpressionFactory”,内容如下:

com.sun.el.ExpressionFactoryImpl

另请参阅this answer

我没有测试第二种方法,但是它在apache-el ExpressionFactory的源代码中具有最高的优先级,而系统属性只是第三种尝试。