我已经使用 Jersey 实现了一个 REST 服务,并且想使用 Bean Validation。当我为 Jersey (jersey-bean-validation) 添加 bean 验证 maven 依赖项时,webapp 由于错误而在启动时中断:
HV000183: Unable to initialize 'jakarta.el.ExpressionFactory'. Check that you have the EL dependencies on the classpath, or use ParameterMessageInterpolator instead
我四处搜索,发现较旧的解决方案提到包括缺少依赖项,例如这个问题:
javax.validation.ValidationException:HV000183:无法加载“javax.el.ExpressionFactory”
但在我的情况下,依赖项已经过时了。此外,在查看依赖关系树时:
[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-validation 库的传递依赖项包含在内。
我在 ResourceBundleMessageInterpolator 中放置了一个断点以找出原因,当 ExpressionFactory 实例化时,会引发异常:
java.util.ServiceConfigurationError: jakarta.el.ExpressionFactory: org.apache.el.ExpressionFactoryImpl not a subtype
我不知道那是从哪里来的。我至少可以使用以下方法按预期创建一个 ExpressionFactory:
ExpressionFactory.newInstance()
我创建了一个非常简单的示例项目,它使用与我在项目中使用的 maven 相同的 Jersey+Jetty 设置:https ://www.dropbox.com/s/dcvief9dlqk648m/valtest.zip?dl=0
它可以运行并且mvn jetty:run
它应该在 http://localhost:8080/test 上显示一条消息。
我错过了什么?