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मेरे लिए समस्या हल करने के लिए हाइबरनेट-सत्यापनकर्ता को अपग्रेड करना।
फ़्रेक्ज़

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 के साथ शुरुआत करना :

हाइबरनेट वैलिडेटर को बाधा उल्लंघन संदेशों में गतिशील अभिव्यक्तियों के मूल्यांकन के लिए एकीकृत अभिव्यक्ति भाषा ( जेएसआर 341 ) के कार्यान्वयन की आवश्यकता होती है । जब आपका एप्लिकेशन WildFly जैसे जावा ईई कंटेनर में चलता है , तो कंटेनर द्वारा पहले से ही एक ईएल कार्यान्वयन प्रदान किया जाता है। एक जावा एसई वातावरण में, हालांकि, आपको अपनी पीओएम फ़ाइल पर निर्भरता के रूप में एक कार्यान्वयन जोड़ना होगा। उदाहरण के लिए, आप 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
बीन सत्यापन 1.1 को कक्षापथ पर अभिव्यक्ति भाषा निर्भरता की आवश्यकता होती है। यह भी देखें hibernate.org/validator/documentation/getting-started
Hardy

1
<निर्भरता> <GroupId> org.glassfish.web </ groupId> <विरूपण साक्ष्य> javax.el </ विरूपण साक्ष्य> <संस्करण> 2.2.4 </ संस्करण> <गुंजाइश> रनटाइम </ गुंजाइश> </ निर्भरता> के रूप में पर्याप्त है हाइबरनेट सत्यापनकर्ता पहले से ही
mvera

8
<dependency><groupId>javax.el</groupId><artifactId>javax.el-api</artifactId><version>2.3.1</version></dependency>मेरे लिए पर्याप्त था
स्लेज

1
<निर्भरता> <GroupId> javax.el </ groupId> <विरूपण साक्ष्य> el-api </ विरूपण साक्ष्य> <संस्करण> 2.2 </ संस्करण> </ निर्भरता> ने मेरी समस्या हल कर दी।
zhy2002

3
ऐसा लगता है कि वे SE वातावरण के लिए github पृष्ठ पर दोनों की सलाह देते हैं: github.com/hibernate/hibernate-valubator । यद्यपि मेरे लिए शीर्ष एक ही पर्याप्त था।
vphilipnyc

56

बस करो

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

8
hibernate-validatorउस निर्भरता पर भरोसा क्यों नहीं करता ?
thomas.mc.work

मुझे नहीं पता कि क्यों लेकिन यह बेहतर होगा
ब्रूनो ली

@ thomas.mc.work मुझे लगता है कि सकरात्मक निर्भरता के मुद्दों से बचने के लिए
gstackoverflow

1
यह वास्तव में पोम फाइल में निर्भरता के रूप में चिह्नित किया गया है, लेकिन प्रदान किए गए मैवेन दायरे के साथ। इसका मतलब है कि यदि आप अपने JavaEE सर्वर को आपके लिए एक प्रदान नहीं करते हैं, तो आप इसे स्वयं जोड़ने के लिए जिम्मेदार हैं।
real_paul

यह समाधान मेरे लिए कारगर नहीं था, मैं हाइबरनेट सत्यापनकर्ता 6.0.4 और java.el का 3.0.0 संस्करण उपयोग कर रहा हूं और मैं WebLogic का उपयोग कर रहा हूं। किसी भी कृपया मेरी मदद कर सकते हैं .. अग्रिम में हाथ मदद की सराहना की।
कुशवाहा

18

यदि आप अपने सर्वर रनटाइम के रूप में टॉमकैट का उपयोग कर रहे हैं और आपको परीक्षणों में यह त्रुटि मिलती है (क्योंकि परीक्षण के दौरान टॉमकैट रनटाइम उपलब्ध नहीं है) तो इससे तात्पर्य है कि ग्लासफिश से एक के बजाय टॉमकैट एल रनटाइम को शामिल करना)। यह होगा:

    <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 का उपयोग करें । हाइबरनेट सत्यापनक एक स्टैंडअलोन घटक है, जिसका उपयोग हाइबरनेट के बिना ही किया जा सकता है।

हाइबरनेट-सत्यापनकर्ता पर निर्भर

<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

यदि स्प्रिंग बूट का उपयोग कर यह अच्छी तरह से काम करता है। स्प्रिंग रिएक्टिव मोंगो के साथ भी।

<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

हाइबरनेट वैलिडेटर प्रलेखन के साथ शुरू होने के अनुसार , एक अभिव्यक्ति भाषा (ईएल) कार्यान्वयन प्रदान करने की आवश्यकता है। एक जावा ईई वातावरण में, यह कंटेनर द्वारा प्रदान किया जाएगा। हालांकि, आपके जैसे स्टैंडअलोन एप्लिकेशन में, इसे प्रदान करने की आवश्यकता है।

हाइबरनेट वैलिडेटर को बाधा उल्लंघन संदेशों में गतिशील अभिव्यक्तियों के मूल्यांकन के लिए एकीकृत अभिव्यक्ति भाषा (JSR 341) के कार्यान्वयन की आवश्यकता होती है।

जब आपका एप्लिकेशन WildFly जैसे जावा ईई कंटेनर में चलता है, तो कंटेनर द्वारा पहले से ही एक ईएल कार्यान्वयन प्रदान किया जाता है।

एक जावा एसई वातावरण में, हालांकि, आपको अपनी पीओएम फ़ाइल पर निर्भरता के रूप में एक कार्यान्वयन जोड़ना होगा। उदाहरण के लिए, आप JSR 341 संदर्भ कार्यान्वयन का उपयोग करने के लिए निम्नलिखित निर्भरता जोड़ सकते हैं:

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

प्रलेखन की निर्भरता का उदाहरण थोड़ा दिनांकित है, क्योंकि अभिव्यक्ति भाषा 2018 में जकार्ता ईई परियोजना में बदल गई है। अभिव्यक्ति भाषा के जकार्ता ईई संस्करण का उपयोग करने के लिए, निम्नलिखित ग्रहण ग्लासफिश ईएल निर्भरता जोड़ें:

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

अन्य ईएल कार्यान्वयन हैं जो ग्लासफिश के अलावा अन्य उपयोग किए जा सकते हैं। उदाहरण के लिए, डिफ़ॉल्ट रूप से स्प्रिंग बूट एम्बेडेड टोमैट का उपयोग करता है । ईएल के इस संस्करण का उपयोग निम्नानुसार किया जा सकता है:

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.