我在使用 Java 17 时遇到 Hibernate Validator 6.2.3 的问题。当尝试使用 org.hibernate.validator.constraints.ScriptAssert 验证实体时,我收到以下错误:
Caused by: org.hibernate.validator.spi.scripting.ScriptEvaluatorNotFoundException: HV000232: No JSR 223 script engine found for language "javascript".
at org.hibernate.validator.internal.engine.scripting.DefaultScriptEvaluatorFactory.createNewScriptEvaluator(DefaultScriptEvaluatorFactory.java:66)
at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708)
at org.hibernate.validator.spi.scripting.AbstractCachingScriptEvaluatorFactory.getScriptEvaluatorByLanguageName(AbstractCachingScriptEvaluatorFactory.java:41)
at org.hibernate.validator.internal.engine.constraintvalidation.HibernateConstraintValidatorInitializationContextImpl.getScriptEvaluatorForLanguage(HibernateConstraintValidatorInitializationContextImpl.java:50)
at org.hibernate.validator.internal.constraintvalidators.hv.AbstractScriptAssertValidator.initialize(AbstractScriptAssertValidator.java:38)
@ScriptAssert(lang=, script=, alias=, reportOn=)
检查给定的脚本是否可以成功评估 带注释的元素。为了使用这个约束, JSR 223 定义的 Java Scripting API 的实现 (“Java™ 平台脚本”)必须是类的一部分 小路。要计算的表达式可以用任何脚本编写 或表达式语言,JSR 223 兼容引擎可以是 在类路径中找到。尽管这是一个类级别的限制, 可以使用reportOn属性来报告约束违规 特定属性而不是整个对象。
JSR 223 API 的标准实现是什么?
任何见解或指导将不胜感激。谢谢!
Nashorn(内置 JDK javascript 引擎)在 JDK 11 中已弃用,并在 JDK 15 中删除:https://openjdk.org/jeps/372
因此,尝试在 JDK 17 上使用
@ScriptAssert
会导致您看到的异常。您可以尝试添加https://github.com/openjdk/nashorn:
<dependency>
<groupId>org.openjdk.nashorn</groupId>
<artifactId>nashorn-core</artifactId>
<version>15.4</version>
</dependency>
或者,您可以尝试切换到不同的脚本语言,例如 Groovy:
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-jsr223</artifactId>
<version>3.0.20</version>
</dependency>
但在这种情况下,您需要更新验证脚本字符串。
顺便说一句,在(添加依赖项)时,您可能需要考虑升级到 Hibernate Validator 8.0(它切换到 jakarta.* API)