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

    }
}

І я отримую наступний стектрек:

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
Модернізація сплячого режиму-валідатора до 5.2.4.Finalвирішеної для мене проблеми.
fracz

1
@fracz У мене сплячий режим-валідатор = 5.2.4.Finalі виняток все ще є.
Альфонсо Нішікава

Відповіді:


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 також вимагає впровадження Єдиної мови вираження ( 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 Validation 1.1 вимагає залежності мови вираження від класового шляху. Дивіться також hibernate.org/validator/documentation/getting-started
Харді

1
<dependency> <groupId> org.glassfish.web </groupId> <artifactId> javax.el </artifactId> <version> 2.2.4 </version> <scope> час виконання </scope> </dependency> достатньо, оскільки сплячий валідатор вже залежить від javax.el-api
mvera

8
<dependency><groupId>javax.el</groupId><artifactId>javax.el-api</artifactId><version>2.3.1</version></dependency>мені було достатньо
Sled

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>

8
Чому не hibernate-validatorпокладаються на цю залежність?
thomas.mc

Не знаю чому, але було б краще
Бруно Лі

@ thomas.mc. робота Я думаю, щоб уникнути проблем з перехідною залежністю
gstackoverflow

1
Його фактично позначено як залежність у файлі pom, але з наданою величиною обсягу. Це означає, що ви відповідально додавати його самостійно, якщо ваш сервер JavaEE не надає його.
real_paul

Це рішення не працювало для мене, я використовую спячий валідатор 6.0.4 та java.el версії 3.0.0, і я використовую WebLogic. Будь-хто, будь ласка, допоможе мені.
Kushwaha

18

Якщо ви використовуєте tomcat як час свого сервера, і ви отримуєте цю помилку в тестах (оскільки час виконання tomcat не доступний під час тестів), ніж має сенс включати виконувану програму tomcat el замість того, щоб виходити зі скла. Це було б:

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

Я тебе люблю. Так.
xdhmoore

Все ще люблю тебе. Схоже, ви можете включити лише tomcat-jasper-elзалежність, оскільки, здається, транзитивно включати tomcat-el-apiзалежність.
xdhmoore

13

Якщо ви використовуєте весняне завантаження із стартерами - ця залежність додає і обоє, tomcat-embed-elі hibernate-validatorзалежності:

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

13

Якщо вам не потрібен javax.el (наприклад, у додатку JavaSE), використовуйте ParameterMessageInterpolator з валідатора сплячки . 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();

Так, я не хочу додавати більше залежності. Гарна робота
nokieng

О, це справді гарна відповідь для мене про бібліотечні проекти.
Джин Квон

Це має бути обрана відповідь.
анаталіоки


4

Якщо використовувати Spring Boot, це добре працює. Навіть із весняним реагуючим Монго.

<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

На початку роботи з документацією зі сну в режимі зимування необхідно забезпечити реалізацію мови виразів (EL) . У середовищі Java EE це надаватиме контейнер. Однак в автономному додатку, такому як ваше, це потрібно передбачити.

Hibernate Validator також вимагає впровадження Єдиної мови вираження (JSR 341) для оцінки динамічних виразів у повідомленнях про порушення обмежень.

Коли ваша програма працює в контейнері Java EE, такому як WildFly, реалізація EL вже передбачена контейнером.

У середовищі Java SE, однак, ви повинні додати реалізацію як залежність до файлу POM. Наприклад, ви можете додати таку залежність, щоб використовувати реалізацію посилань JSR 341:

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

Приклад залежності документації трохи датований, оскільки мова виразів перейшла до проекту Джакарта EE у 2018 році. Щоб використовувати версію мови вираження Jakarta EE, додайте таку залежність EL Eclipse Glassfish EL:

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

Є й інші реалізації EL, які можуть використовуватися крім Glassfish. Наприклад, Spring Boot за замовчуванням використовує вбудований Tomcat . Цю версію EL можна використовувати наступним чином:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.