Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jersey Bean验证:无法初始化';雅加达el.ExpressionFactory&x27;_Java_Maven_Jersey_Jetty_Jersey 3.0 - Fatal编程技术网

Java Jersey Bean验证:无法初始化';雅加达el.ExpressionFactory&x27;

Java Jersey Bean验证:无法初始化';雅加达el.ExpressionFactory&x27;,java,maven,jersey,jetty,jersey-3.0,Java,Maven,Jersey,Jetty,Jersey 3.0,我已经使用Jersey实现了一个REST服务,并希望使用Bean验证。当我为Jersey添加bean validation maven依赖项(Jersey bean validation)时,webapp在启动时会由于以下错误而中断: HV000183: Unable to initialize 'jakarta.el.ExpressionFactory'. Check that you have the EL dependencies on the classpath, or use Para

我已经使用Jersey实现了一个REST服务,并希望使用Bean验证。当我为Jersey添加bean validation maven依赖项(Jersey bean validation)时,webapp在启动时会由于以下错误而中断:

HV000183: Unable to initialize 'jakarta.el.ExpressionFactory'. Check that you have the EL dependencies on the classpath, or use ParameterMessageInterpolator instead
我四处搜索,发现了旧的解决方案,包括缺少依赖项,如以下问题:

但在我的例子中,依赖性已经过时了。此外,在查看依赖关系树时:

[INFO] org.example:valtest:war:1.0-SNAPSHOT
[INFO] +- org.glassfish.jersey.containers:jersey-container-servlet:jar:3.0.2:compile
[INFO] |  +- org.glassfish.jersey.containers:jersey-container-servlet-core:jar:3.0.2:compile
[INFO] |  +- org.glassfish.jersey.core:jersey-common:jar:3.0.2:compile
[INFO] |  |  +- jakarta.annotation:jakarta.annotation-api:jar:2.0.0:compile
[INFO] |  |  \- org.glassfish.hk2:osgi-resource-locator:jar:1.0.3:compile
[INFO] |  +- org.glassfish.jersey.core:jersey-server:jar:3.0.2:compile
[INFO] |  |  \- org.glassfish.jersey.core:jersey-client:jar:3.0.2:compile
[INFO] |  \- jakarta.ws.rs:jakarta.ws.rs-api:jar:3.0.0:compile
[INFO] +- org.glassfish.jersey.inject:jersey-hk2:jar:3.0.2:compile
[INFO] |  +- org.glassfish.hk2:hk2-locator:jar:3.0.1:compile
[INFO] |  |  +- org.glassfish.hk2.external:aopalliance-repackaged:jar:3.0.1:compile
[INFO] |  |  +- org.glassfish.hk2:hk2-api:jar:3.0.1:compile
[INFO] |  |  \- org.glassfish.hk2:hk2-utils:jar:3.0.1:compile
[INFO] |  \- org.javassist:javassist:jar:3.25.0-GA:compile
[INFO] \- org.glassfish.jersey.ext:jersey-bean-validation:jar:3.0.2:compile
[INFO]    +- jakarta.inject:jakarta.inject-api:jar:2.0.0:compile
[INFO]    +- jakarta.validation:jakarta.validation-api:jar:3.0.0:compile
[INFO]    +- org.hibernate.validator:hibernate-validator:jar:7.0.0.Final:compile
[INFO]    |  +- org.jboss.logging:jboss-logging:jar:3.4.1.Final:compile
[INFO]    |  \- com.fasterxml:classmate:jar:1.5.1:compile
[INFO]    +- jakarta.el:jakarta.el-api:jar:4.0.0:compile
[INFO]    \- org.glassfish:jakarta.el:jar:4.0.0:compile
我可以在最底层看到,el api和el库已经作为jersey bean验证库的可传递依赖项包含在内

我在ResourceBundleMessageInterpolator中放置了一个断点以找出原因,当ExpressionFactory被实例化时,会抛出一个异常:

java.util.ServiceConfigurationError: jakarta.el.ExpressionFactory: org.apache.el.ExpressionFactoryImpl not a subtype
我不知道这是从哪里来的。我至少可以使用以下方法按预期创建ExpressionFactory:

ExpressionFactory.newInstance()
我创建了一个非常简单的示例项目,该项目使用与我在项目中使用的maven相同的Jersey+Jetty设置: 可以使用
mvn jetty:run
运行它,它应该在http://localhost:8080/test.

我错过了什么?

tl;博士 Jetty Maven插件引入了一个冲突的依赖项。依赖关系处理JSP。如果应用程序中不需要JSP,我认为以下解决方案应该是安全的。您只需要排除坏的依赖项


org.eclipse.jetty
. 
org.glassfish:jakarta.el
jar没有通过
ServiceLoader
找到所需的
META-INF/services
文件。但是
ServiceLoader
失败后,将尝试其他选项。所以最终,我们会找到罐子的。但问题是Jetty Maven插件还引入了一个实现,它确实包含
META-INF/services
文件。这就是将要使用的实现

经过一些调试并进入,我在发现该类时遇到了以下错误:

“jakarta.el.ExpressionFactory:org.apache.el.ExpressionFactoryImpl不是子类型”
因此,我创建了一个新的Maven项目,并添加了jetty Maven插件作为依赖项。在搜索了所有的jar之后,我找到了
o.a.e.expressionfactorympl
类。Jetty就是在ApacheEL的罐子里停下来的。奇怪的是,这个类实际上实现了
jakarta.el.ExpressionFactory
。我认为问题可能在于它实现了旧的
javax
类,但事实并非如此。我不完全确定这为什么会导致错误。但在解决了这个问题后,它开始起作用了

如果不需要删除apache el

在获得上述解决方案之前,我尝试过的一件事是尝试手动将
META-INF/services
文件添加到
org.glassfish:jakarta.el
jar。我所做的是

cd~/.m2/repository/org/glassfish/jakarta.el/4.0.0
mkdir-p META-INF/services
echo com.sun.el.ExpressionFactoryImpl>META-INF/services/jakarta.el.ExpressionFactory
jar uf jakarta.el-4.0.0.jar META-INF/services/jakarta.el.ExpressionFactory
#在执行此操作之前,您可能需要复制原始依赖项
#因此,如果需要,您可以轻松恢复到原始状态。
这可能也不是一个理想的解决方案,但它奏效了


如果您需要
apacheel
,也可以尝试用
org.glassfish:jakarta.el
替换它,看看是否有效。我还没有尝试过,但我不确定Jetty是否会在不同的实现中遇到类似的问题。

非常感谢您的详细回答!它现在可以正常工作了。