javax.validation.ValidationException: HV000183: 'javax.el.ExpressionFactory' yüklenemiyor


103

Hazırda bekletme doğrulayıcısı ile çok basit bir uygulama yazmaya çalışıyorum:

adımlarım:

pom.xml'ye aşağıdaki bağımlılığı ekleyin:

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

kodu yaz:

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

    }
}

Ve aşağıdaki stacktrace'i alıyorum:

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

Neyi yanlış yapıyorum?


1
Hazırda bekletme doğrulayıcısını 5.2.4.Finalbenim için çözülen problem için yükseltme .
fracz

1
@fracz Hazırda bekletme-doğrulayıcım var = 5.2.4.Finalve istisna hala orada.
Alfonso Nishikawa

Yanıtlar:


154

pom.xmlAşağıdaki bağımlılıklara ekledikten sonra çalışıyor :

<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'a başlarken :

Hibernate Validator ayrıca kısıtlama ihlali mesajlarındaki dinamik ifadeleri değerlendirmek için Birleşik İfade Dili'nin ( JSR 341 ) uygulanmasını gerektirir . Uygulamanız WildFly gibi bir Java EE konteynerinde çalıştığında , konteyner tarafından zaten bir EL uygulaması sağlanır. Ancak bir Java SE ortamında, POM dosyanıza bağımlılık olarak bir uygulama eklemeniz gerekir. Örneğin, JSR 341 referans uygulamasını kullanmak için aşağıdaki iki bağımlılığı ekleyebilirsiniz :

<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 Doğrulama 1.1, sınıf yolunda İfade Dili bağımlılıklarını gerektirir. Ayrıca bkz. 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> şu kadar yeterlidir: hazırda bekletme doğrulayıcısı zaten javax.el-api'ye bağlı
mvera

8
<dependency><groupId>javax.el</groupId><artifactId>javax.el-api</artifactId><version>2.3.1</version></dependency>benim için yeterliydi
Kızak

1
<dependency> <groupId> javax.el </groupId> <artifactId> el-api </artifactId> <version> 2.2 </version> </dependency> sorunumu çözdü.
zhy2002

3
Görünüşe göre her ikisini de SE ortamları için github sayfasında öneriyorlar: github.com/hibernate/hibernate-validator . En iyisi benim için yeterliydi.
vphilipnyc

56

sadece yap

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

8
Neden hibernate-validatorbu bağımlılığa güvenmiyor?
thomas.mc.work

Neden bilmiyorum ama daha iyi olur
Bruno Lee

@ thomas.mc.work Geçişli bağımlılık sorunlarından kaçınmayı düşünüyorum
gstackoverflow

1
Aslında pom dosyasında bağımlılık olarak işaretlenmiştir, ancak sağlanan maven kapsamı ile. Bu, JavaEE sunucunuz sizin için bir sunucu sağlamıyorsa, onu kendiniz eklemekten sorumlu olduğunuz anlamına gelir.
real_paul

Bu çözüm benim için işe yaramadı, hazırda bekletme doğrulayıcısı 6.0.4 ve java.el 3.0.0 sürümünü kullanıyorum ve WebLogic kullanıyorum. Herhangi biri lütfen bana yardım edebilir mi .. ellere önceden yardım etmek için minnettarım.
Kushwaha

18

Tomcat'i sunucu çalışma zamanınız olarak kullanıyorsanız ve bu hatayı testlerde alıyorsanız (çünkü tomcat çalışma zamanı testler sırasında kullanılamaz), cam balığı yerine tomcat el çalışma zamanını dahil etmek mantıklıdır). Bu olabilir:

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

Seni seviyorum. Evet.
xdhmoore

Hala seni seviyorum. Görünüşe göre tomcat-jasper-elbağımlılığı geçişli olarak içeriyor gibi göründüğü için sadece bağımlılığı dahil edebilirsiniz tomcat-el-api.
xdhmoore

13

Eğer başlayanlar ile bahar çizme kullanıyorsanız - Bu bağımlılık hem ekler tomcat-embed-elve hibernate-validatorbağımlılıkları:

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

13

Eğer gerekmez javax.el (a JavaSE uygulamasında örneğin) kullanımı ParameterMessageInterpolator gelen hazırda doğrulayıcı . Hazırda Bekletme doğrulayıcısı, Hazırda Bekletme olmadan kullanılabilen bağımsız bir bileşendir .

Hazırda bekletme doğrulayıcısına bağlı

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

ParameterMessageInterpolator'ı kullanın

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

Evet, daha fazla bağımlılık eklemek istemiyorum. İyi iş
nokieng

Oh, bu benim için kütüphane projeleriyle ilgili gerçekten iyi bir cevap.
Jin Kwon

Bu seçilen cevap olmalıdır.
anataliocs


4

Spring Boot kullanılıyorsa bu iyi çalışır. Spring Reactive Mongo ile bile.

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

ve doğrulama yapılandırması:

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 için aşağıdaki sürümleri kullanın

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

Başına hazırda Doğrulayıcı başlarken belgeler, bir İfade Dili (EL) uygulanması temin edilmesi gerekmektedir. Bir Java EE ortamında, konteyner tarafından sağlanacaktır. Bununla birlikte, sizinki gibi bağımsız bir uygulamada sağlanması gerekir.

Hibernate Validator ayrıca kısıtlama ihlali mesajlarındaki dinamik ifadeleri değerlendirmek için Birleşik İfade Dili'nin (JSR 341) uygulanmasını gerektirir.

Uygulamanız WildFly gibi bir Java EE konteynerinde çalıştığında, konteyner tarafından zaten bir EL uygulaması sağlanır.

Ancak bir Java SE ortamında, POM dosyanıza bağımlılık olarak bir uygulama eklemeniz gerekir. Örneğin, JSR 341 referans uygulamasını kullanmak için aşağıdaki bağımlılığı ekleyebilirsiniz:

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

İfade dili 2018'de Jakarta EE projesine geçtiğinden , dokümantasyonun bağımlılık örneği biraz tarihli. İfade dilinin Jakarta EE sürümünü kullanmak için aşağıdaki Eclipse Glassfish EL bağımlılığını ekleyin :

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

Glassfish dışında kullanılabilecek başka EL uygulamaları da vardır. Örneğin, Spring Boot varsayılan olarak gömülü Tomcat kullanır . EL'nin bu sürümü aşağıdaki şekilde kullanılabilir:

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

0

gradle için:

compile 'javax.el:javax.el-api:2.2.4'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.