javax.validation.ValidationException: HV000183: Tidak dapat memuat 'javax.el.ExpressionFactory'


103

Saya mencoba menulis aplikasi yang sangat sederhana dengan validator hibernate:

langkah saya:

tambahkan ketergantungan berikut di pom.xml:

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

tulis kode:

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);

    }
}

Dan saya mendapatkan stacktrace berikut:

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

Apa yang salah


1
Meningkatkan hibernate-validator untuk 5.2.4.Finalmemecahkan masalah saya.
fracz

1
@fracz Saya memiliki hibernate-validator = 5.2.4.Finaldan pengecualiannya masih ada.
Alfonso Nishikawa

Jawaban:


154

Ini berfungsi setelah menambahkan ke pom.xmldependensi berikut:

<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>

Memulai dengan Hibernate Validator :

Hibernate Validator juga memerlukan implementasi Unified Expression Language ( JSR 341 ) untuk mengevaluasi ekspresi dinamis dalam pesan pelanggaran batasan. Saat aplikasi Anda berjalan di container Java EE seperti WildFly , implementasi EL sudah disediakan oleh container. Namun, dalam lingkungan Java SE, Anda harus menambahkan implementasi sebagai dependensi ke file POM Anda. Misalnya, Anda dapat menambahkan dua dependensi berikut untuk menggunakan implementasi referensi 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 Validation 1.1 membutuhkan dependensi Expression Language pada classpath. Lihat juga 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> sudah cukup karena validator hibernate sudah bergantung pada javax.el-api
mvera

8
<dependency><groupId>javax.el</groupId><artifactId>javax.el-api</artifactId><version>2.3.1</version></dependency>cukup bagi saya
Kereta luncur

1
<dependency> <groupId> javax.el </groupId> <artifactId> el-api </artifactId> <version> 2.2 </version> </dependency> memecahkan masalah saya.
zhy2002

3
Sepertinya mereka merekomendasikan keduanya di halaman github untuk lingkungan SE: github.com/hibernate/hibernate-validator . Yang teratas sudah cukup bagiku.
vphilipnyc

56

lakukan saja

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

8
Mengapa tidak hibernate-validatormengandalkan ketergantungan itu?
thomas.mc.work

Saya tidak tahu mengapa tetapi akan lebih baik
Bruno Lee

@ thomas.mc.work Saya pikir untuk menghindari masalah ketergantungan transitif
gstackoverflow

1
Ini sebenarnya ditandai sebagai ketergantungan dalam file pom tetapi dengan cakupan maven yang disediakan. Ini berarti Anda bertanggung jawab untuk menambahkannya sendiri jika server JavaEE Anda tidak menyediakannya untuk Anda.
real_paul

Solusi ini tidak berhasil untuk saya, saya menggunakan validator hibernate 6.0.4 dan java.el versi 3.0.0 dan saya menggunakan WebLogic. Adakah yang bisa membantu saya .. menghargai uluran tangan sebelumnya.
Kushwaha

18

Jika Anda menggunakan tomcat sebagai runtime server Anda dan Anda mendapatkan kesalahan ini dalam pengujian (karena runtime tomcat tidak tersedia selama pengujian) daripada memasukkan runtime el tomcat daripada yang dari glassfish). Ini akan menjadi:

    <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>

Aku cinta kamu. Iya.
xdhmoore

Masih mencintaimu. Sepertinya Anda hanya dapat menyertakan tomcat-jasper-eldependensi, karena tampaknya secara transitif menyertakan tomcat-el-apidependensi.
xdhmoore

13

Jika Anda menggunakan boot musim semi dengan permulaan - ketergantungan ini menambahkan keduanya tomcat-embed-eldan hibernate-validatorketergantungan:

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

13

Jika Anda tidak memerlukan javax.el (misalnya dalam aplikasi JavaSE), gunakan ParameterMessageInterpolator dari validator Hibernate . Validator Hibernate adalah komponen mandiri, yang dapat digunakan tanpa Hibernate itu sendiri.

Bergantung pada hibernate-validator

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

Gunakan 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();

Ya, saya tidak ingin menambah ketergantungan.
Kerja

Oh, ini benar-benar jawaban yang bagus untuk saya terkait proyek perpustakaan.
Jin Kwon

Ini harus menjadi jawaban yang dipilih.
anataliocs


4

Jika menggunakan Spring Boot ini berfungsi dengan baik. Bahkan dengan Spring Reactive Mongo.

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

dan konfigurasi validasi:

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

untuk sbt, gunakan versi di bawah ini

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

Sesuai dengan dokumentasi Memulai Hibernate Validator , implementasi Expression Language (EL) perlu disediakan. Di lingkungan Java EE, ini akan disediakan oleh container. Namun, dalam aplikasi mandiri seperti milik Anda, itu perlu disediakan.

Hibernate Validator juga memerlukan implementasi Unified Expression Language (JSR 341) untuk mengevaluasi ekspresi dinamis dalam pesan pelanggaran batasan.

Saat aplikasi Anda berjalan di container Java EE seperti WildFly, implementasi EL sudah disediakan oleh container.

Namun, dalam lingkungan Java SE, Anda harus menambahkan implementasi sebagai dependensi ke file POM Anda. Misalnya, Anda dapat menambahkan dependensi berikut untuk menggunakan implementasi referensi JSR 341:

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

Contoh dependensi dokumentasi agak ketinggalan zaman, karena bahasa ekspresi dialihkan ke proyek Jakarta EE pada tahun 2018. Untuk menggunakan bahasa ekspresi versi Jakarta EE, tambahkan dependensi Eclipse Glassfish EL berikut :

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

Ada implementasi EL lain yang bisa digunakan selain Glassfish. Misalnya, Spring Boot secara default menggunakan Tomcat tertanam . Versi EL ini dapat digunakan sebagai berikut:

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

0

untuk gradle:

compile 'javax.el:javax.el-api:2.2.4'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.