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

gstackoverflow
sumber
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>
gstackoverflow
sumber
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>
Bruno Lee
sumber
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>
walkeros
sumber
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>
Michał Stochmal
sumber
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();
Markus Schulte
sumber
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
12

Mengenai halaman dokumentasi validator Hibernate , Anda harus menentukan ketergantungan pada JSR-341implementasi:

<dependency>
   <groupId>org.glassfish</groupId>
   <artifactId>javax.el</artifactId>
   <version>3.0.1-b11</version>
</dependency>
herau
sumber
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();
    }
}
Pisau cukur
sumber
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"
prathameshr.dll
sumber
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>
M. Justin
sumber
0

untuk gradle:

compile 'javax.el:javax.el-api:2.2.4'
borino
sumber