javax.validation.ValidationException:HV000183: 'javax.el.E​​xpressionFactory'をロードできません


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
hibernate-validatorをアップグレード5.2.4.Finalして問題を解決しました。
fracz 2016年

1
@fracz私にはhibernate-validator =が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の使用開始

Hibernate Validatorには、制約違反メッセージの動的式を評価するための統一式言語(JSR 341)の実装も必要です。アプリケーションがWildFlyなどのJava EEコンテナーで実行されている場合、EL実装はコンテナーによって既に提供されています。ただし、Java SE環境では、依存関係として実装をPOMファイルに追加する必要があります。たとえば、次の2つの依存関係を追加して、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
Hardy

1
<dependency> <groupId> org.glassfish.web </ groupId> <artifactId> javax.el </ artifactId> <version> 2.2.4 </ version> <scope> runtime </ scope> </ dependency>は次のように十分ですhibernateバリデーターはすでにjavax.el-apiに依存しています
mvera '15

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

3
SE環境のgithubページgithub.com/hibernate/hibernate-validatorで両方を推奨しているようです。でも一番上は十分でした。
vphilipnyc 2016年

56

ただやる

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

8
なぜhibernate-validatorその依存関係に依存しないのですか?
thomas.mc.work

理由はわかりませんが、それが良いでしょう
Bruno Lee

@ thomas.mc.work推移的な依存関係の問題を回避すると思います
gstackoverflow '19年

1
実際には、pomファイルで依存関係としてマークされていますが、mavenスコープが提供されています。つまり、JavaEEサーバーが提供していない場合は、自分で追加する必要があります。
real_paul 2017

このソリューションは機能しませんでした。私はhibernate validator 6.0.4および3.0.0バージョンのjava.elを使用しており、WebLogicを使用しています。どなたでも手伝って頂けますか。
Kushwaha

18

サーバーランタイムとしてtomcatを使用していて、テストでこのエラーが発生した場合(テスト中にtomcatランタイムは使用できないため)、glassfishのランタイムではなく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

スターターでSpring Bootを使用している場合-この依存関係はtomcat-embed-elhibernate-validator依存関係の両方を追加します:

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

13

(JavaSEアプリケーションなどで)javax.elが必要ない場合は、HibernateバリデーターのParameterMessageInterpolatorを使用します。Hibernateバリデーターはスタンドアロンコンポーネントであり、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();

ええ、依存関係を追加したくありません。よくできました
nokieng

ああ、これは図書館プロジェクトに関して私にとって本当に良い答えです。
ジンクォン

これが選ばれた答えです。
anataliocs


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

パーHibernateバリの入門ドキュメント、式言語(EL)の実装を提供する必要があります。Java EE環境では、コンテナーによって提供されます。ただし、あなたのようなスタンドアロンのアプリケーションでは、それを提供する必要があります。

Hibernate Validatorには、制約違反メッセージの動的式を評価するための統合式言語(JSR 341)の実装も必要です。

アプリケーションがWildFlyなどのJava EEコンテナーで実行される場合、EL実装はコンテナーによって既に提供されています。

ただし、Java SE環境では、依存関係として実装をPOMファイルに追加する必要があります。たとえば、次の依存関係を追加して、JSR 341リファレンス実装を使用できます。

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

2018年に式言語がJakarta EEプロジェクト移行したため、ドキュメントの依存関係の例は少し日付が異なります。式言語のJakarta EEバージョンを使用するには、次のEclipse Glassfish EL依存関係を追加します。

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

Glassfish以外に使用できる他のEL実装があります。たとえば、Spring 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.