javax.validation.ValidationException: HV000183: ไม่สามารถโหลด 'javax.el.ExpressionFactory'


103

ฉันพยายามเขียนแอปพลิเคชั่นที่เรียบง่ายมากด้วยตัวตรวจสอบความจำศีล:

ขั้นตอนของฉัน:

เพิ่มการอ้างอิงต่อไปนี้ใน pom.xml:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.1.1.Final</version>
</dependency>

เขียนโค้ด:

class Configuration {
    Range(min=1,max=100)
    int threadNumber;
    //...

    public static void main(String[] args) {
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();

        Validator validator = factory.getValidator();

        Configuration configuration = new Configuration();
        configuration.threadNumber = 12;
            //...

        Set<ConstraintViolation<Configuration>> constraintViolations = validator.validate(configuration);
        System.out.println(constraintViolations);

    }
}

และฉันได้รับการติดตาม stacktrace:

Exception in thread "main" javax.validation.ValidationException: Unable to instantiate Configuration.
    at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:279)
    at javax.validation.Validation.buildDefaultValidatorFactory(Validation.java:110)
    ...
    at org.hibernate.validator.internal.engine.ConfigurationImpl.<init>(ConfigurationImpl.java:110)
    at org.hibernate.validator.internal.engine.ConfigurationImpl.<init>(ConfigurationImpl.java:86)
    at org.hibernate.validator.HibernateValidator.createGenericConfiguration(HibernateValidator.java:41)
    at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:276)
    ... 2 more

ฉันทำอะไรผิด?


1
กำลังอัปเกรด hibernate-validator เพื่อ5.2.4.Finalแก้ไขปัญหาให้ฉัน
fracz

1
@fracz ฉันมี hibernate-validator = 5.2.4.Finalและยังมีข้อยกเว้นอยู่
Alfonso Nishikawa

คำตอบ:


154

มันทำงานหลังจากเพิ่มการpom.xmlอ้างอิงต่อไปนี้:

<dependency>
   <groupId>javax.el</groupId>
   <artifactId>javax.el-api</artifactId>
   <version>2.2.4</version>
</dependency>
<dependency>
   <groupId>org.glassfish.web</groupId>
   <artifactId>javax.el</artifactId>
   <version>2.2.4</version>
</dependency>

เริ่มต้นใช้งาน Hibernate Validator :

Hibernate Validator ยังต้องการการใช้งาน Unified Expression Language ( JSR 341 ) สำหรับการประเมินนิพจน์แบบไดนามิกในข้อความที่มีการละเมิดข้อ จำกัด เมื่อแอปพลิเคชันของคุณทำงานในคอนเทนเนอร์ Java EE เช่นWildFly คอนเทนเนอร์จะมีการใช้งาน EL อยู่แล้ว อย่างไรก็ตามในสภาพแวดล้อม Java SE คุณต้องเพิ่มการนำไปใช้งานเป็นการอ้างอิงกับไฟล์ POM ของคุณ ตัวอย่างเช่นคุณสามารถเพิ่มการอ้างอิงสองรายการต่อไปนี้เพื่อใช้การใช้งานการอ้างอิง JSR 341 :

<dependency>
   <groupId>javax.el</groupId>
   <artifactId>javax.el-api</artifactId>
   <version>2.2.4</version>
</dependency>
<dependency>
   <groupId>org.glassfish.web</groupId>
   <artifactId>javax.el</artifactId>
   <version>2.2.4</version>
</dependency>

5
การตรวจสอบความถูกต้องของ Bean 1.1 ต้องการการอ้างอิงภาษานิพจน์บน classpath ดูhibernate.org/validator/documentation/getting-started
Hardy

1
<dependency> <groupId> org.glassfish.web </groupId> <artifactId> javax.el </artifactId> <version> 2.2.4 </version> <scope> runtime </scope> </dependency> มีความสำคัญเท่ากับ hibernate validator ขึ้นอยู่กับ javax.el-api แล้ว
mvera

8
<dependency><groupId>javax.el</groupId><artifactId>javax.el-api</artifactId><version>2.3.1</version></dependency>เพียงพอสำหรับฉัน
เลื่อน

1
<dependency> <groupId> javax.el </groupId> <artifactId> el-api </artifactId> <version> 2.2 </version> </dependency> แก้ปัญหาของฉันได้
zhy2002

3
ดูเหมือนว่าพวกเขาแนะนำให้ทั้งบนหน้า GitHub สำหรับสภาพแวดล้อม SE: github.com/hibernate/hibernate-validator อันดับแรกก็เพียงพอสำหรับฉันแล้ว
vphilipnyc

56

ทำเพียง

<dependency>
   <groupId>javax.el</groupId>
   <artifactId>javax.el-api</artifactId>
   <version>2.2.4</version>
</dependency>

9
ทำไมไม่hibernate-validatorพึ่งพาที่พึ่งนั้น
thomas.mc.work

ฉันไม่รู้ว่าทำไม แต่มันจะดีกว่า
Bruno Lee

@ thomas.mc.work ฉันคิดว่าจะหลีกเลี่ยงปัญหาการพึ่งพาสกรรมกริยา
gstackoverflow

1
จริงๆแล้วมันถูกทำเครื่องหมายว่าขึ้นอยู่กับไฟล์ pom แต่มีขอบเขต maven ที่ให้มา ซึ่งหมายความว่าคุณต้องรับผิดชอบในการเพิ่มเองหากเซิร์ฟเวอร์ JavaEE ของคุณไม่มีให้คุณ
real_paul

วิธีนี้ใช้ไม่ได้ผลสำหรับฉันฉันใช้ hibernate validator 6.0.4 และ java.el เวอร์ชัน 3.0.0 และฉันใช้ WebLogic ใครก็ได้ช่วยฉันหน่อยได้ไหม .. ชื่นชมมือช่วยล่วงหน้า
Kushwaha

18

หากคุณใช้ tomcat เป็นรันไทม์เซิร์ฟเวอร์ของคุณและคุณได้รับข้อผิดพลาดนี้ในการทดสอบ (เนื่องจากรันไทม์ tomcat ไม่พร้อมใช้งานในระหว่างการทดสอบ) มากกว่าที่ควรจะรวมรันไทม์ tomcat el แทนจาก glassfish) นี่จะเป็น:

    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-el-api</artifactId>
        <version>8.5.14</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-jasper-el</artifactId>
        <version>8.5.14</version>
        <scope>test</scope>
    </dependency>

ยังคงรักคุณ. ดูเหมือนว่าคุณสามารถรวมการtomcat-jasper-elพึ่งพาได้เท่านั้นเนื่องจากดูเหมือนว่าจะรวมการtomcat-el-apiพึ่งพาแบบสกรรมกริยา
xdhmoore

13

หากคุณใช้สปริงบูตกับ starters การพึ่งพานี้จะเพิ่มทั้งสองอย่างtomcat-embed-elและการhibernate-validatorอ้างอิง:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

13

ในกรณีที่คุณไม่จำเป็นต้องjavax.el (ตัวอย่างเช่นในการประยุกต์ใช้ JavaSE) ใช้ParameterMessageInterpolatorจากHibernate ตรวจสอบ Hibernate validator เป็นส่วนประกอบแบบสแตนด์อโลนซึ่งสามารถใช้ได้โดยไม่ต้องHibernateเอง

ขึ้นอยู่กับ hibernate-validator

<dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-validator</artifactId>
   <version>6.0.16.Final</version>
</dependency>

ใช้ ParameterMessageInterpolator

import javax.validation.Validation;
import javax.validation.Validator;
import org.hibernate.validator.messageinterpolation.ParameterMessageInterpolator;

private static final Validator VALIDATOR =
  Validation.byDefaultProvider()
    .configure()
    .messageInterpolator(new ParameterMessageInterpolator())
    .buildValidatorFactory()
    .getValidator();

ใช่ฉันไม่ต้องการเพิ่มการพึ่งพาอีกแล้ว Good job
nokieng

นี่เป็นคำตอบที่ดีสำหรับฉันเกี่ยวกับโครงการห้องสมุด
จินควอน

นี่ควรเป็นคำตอบที่เลือก
anataliocs


4

หากใช้ Spring Boot สิ่งนี้ใช้ได้ดี แม้จะมี Spring Reactive Mongo

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

และการกำหนดค่าการตรวจสอบความถูกต้อง:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.mapping.event.ValidatingMongoEventListener;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;

@Configuration
public class MongoValidationConfig {

    @Bean
    public ValidatingMongoEventListener validatingMongoEventListener() {
        return new ValidatingMongoEventListener(validator());
    }

    @Bean
    public LocalValidatorFactoryBean validator() {
        return new LocalValidatorFactoryBean();
    }
}

2

สำหรับ sbt ให้ใช้เวอร์ชันด้านล่าง

val glassfishEl = "org.glassfish" % "javax.el" % "3.0.1-b09"

val hibernateValidator = "org.hibernate.validator" % "hibernate-validator" % "6.0.17.Final"

val hibernateValidatorCdi = "org.hibernate.validator" % "hibernate-validator-cdi" % "6.0.17.Final"

1

ต่อการเริ่มต้นกับ Hibernate ตรวจสอบเอกสารการแสดงออกภาษา (EL)การดำเนินการตามความต้องการที่จะให้ ในสภาพแวดล้อม Java EE นั้นจะถูกจัดเตรียมโดยคอนเทนเนอร์ อย่างไรก็ตามในแอปพลิเคชันแบบสแตนด์อโลนเช่นของคุณจำเป็นต้องมีให้

นอกจากนี้ Hibernate Validator ยังต้องการการใช้งาน Unified Expression Language (JSR 341) สำหรับการประเมินนิพจน์แบบไดนามิกในข้อความการละเมิดข้อ จำกัด

เมื่อแอปพลิเคชันของคุณทำงานในคอนเทนเนอร์ Java EE เช่น WildFly คอนเทนเนอร์จะมีการใช้งาน EL อยู่แล้ว

อย่างไรก็ตามในสภาพแวดล้อม Java SE คุณต้องเพิ่มการนำไปใช้งานเป็นการอ้างอิงกับไฟล์ POM ของคุณ ตัวอย่างเช่นคุณสามารถเพิ่มการอ้างอิงต่อไปนี้เพื่อใช้การใช้งานการอ้างอิง JSR 341:

<dependency>
  <groupId>org.glassfish</groupId>
  <artifactId>javax.el</artifactId>
  <version></version>
</dependency>

ตัวอย่างการอ้างอิงของเอกสารประกอบเป็นวันที่เล็กน้อยเนื่องจากภาษานิพจน์เปลี่ยนไปใช้โครงการ Jakarta EEในปี 2018 หากต้องการใช้ภาษานิพจน์รุ่น Jakarta EE ให้เพิ่มการพึ่งพาEclipse Glassfish EL ต่อไปนี้:

<dependency>
   <groupId>org.glassfish</groupId>
   <artifactId>jakarta.el</artifactId>
   <version>3.0.3</version>
</dependency>

มีการใช้งาน EL อื่น ๆ ที่สามารถใช้ได้นอกเหนือจาก Glassfish ยกตัวอย่างเช่นในฤดูใบไม้ผลิ Bootใช้โดยค่าเริ่มต้นฝังTomcat EL เวอร์ชันนี้สามารถใช้งานได้ดังนี้:

<dependency>
   <groupId>org.apache.tomcat.embed</groupId>
   <artifactId>tomcat-embed-el</artifactId>
   <version>9.0.30</version>
</dependency>

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.