programing

Bean Validation 공급자를 찾을 수 없기 때문에 구성을 만들 수 없습니다.클래스 경로에 휴지 상태 검증 프로그램(RI) 등의 공급자 추가

lovejava 2023. 2. 23. 21:56

Bean Validation 공급자를 찾을 수 없기 때문에 구성을 만들 수 없습니다.클래스 경로에 휴지 상태 검증 프로그램(RI) 등의 공급자 추가

오늘 이메일 보내기를 검토 중인데

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>4.2.5.RELEASE</version>
</dependency>

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>7.0</version>
</dependency>

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>javax.mail-api</artifactId>
    <version>1.5.5</version>
</dependency>

"Unable to create a Configuration, bean validation provider를 찾을 수 없기 때문입니다.클래스 패스에 Hibernate Validator(RI)등의 프로바이더를 추가합니다」검증 예외입니다.

템플릿 MVC 프로젝트에 위의 의존관계와 이메일 의존관계를 추가했습니다.

오류 스택 추적:

DEBUG: org.springframework.ui.context.support.UiApplicationContextUtils - Unable to locate ThemeSource with name 'themeSource': using default [org.springframework.ui.context.support.DelegatingThemeSource@20212230]
DEBUG: org.springframework.validation.beanvalidation.OptionalValidatorFactoryBean - Failed to set up a Bean Validation provider
javax.validation.ValidationException: Unable to create a Configuration, because no Bean Validation provider could be found. Add a provider like Hibernate Validator (RI) to your classpath.
    at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:271)
    at org.springframework.validation.beanvalidation.LocalValidatorFactoryBean.afterPropertiesSet(LocalValidatorFactoryBean.java:223)
    at org.springframework.validation.beanvalidation.OptionalValidatorFactoryBean.afterPropertiesSet(OptionalValidatorFactoryBean.java:40)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538)
    at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:667)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:633)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:681)
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:552)
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:493)
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
    at javax.servlet.GenericServlet.init(GenericServlet.java:158)
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1241)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1154)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1041)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4944)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5230)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1399)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

Bean Validation Provider 의존 관계(예: 휴지 상태 검증기)를 추가합니다.클래스 경로에서 Bean Validation API 종속성을 사용할 수 있지만 구현이 누락되었습니다.다음 항목을 pom.xml에 추가합니다.

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

Spring Boot 및 Gradle 사용자에게 동일한 문제를 해결하려면 프로젝트에 다음과 같은 종속성을 추가합니다.

implementation 'org.springframework.boot:spring-boot-starter-validation'

저의 경우, Hibernate 7.x로 이행했지만, 다음과 같은 것에 대한 명확한 의존관계가 있습니다.

<dependency>
  <artifactId>validation-api</artifactId>
  <groupId>javax.validation</groupId>
  <version>2.0.1.Final</version>
</dependency>

일단 이 의존관계를 삭제하고 휴지상태에서 자카르타 빈 검증 API(jakarta.validation:jakarta.validation-api:3.0.0)에 종속성을 일시적으로 끌어당길 수 있도록 했습니다.모든 것이 잘 작동했다.

종속성을 하나만 추가하고 오류를 해결할 수 있습니다.

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

org.springframework.boot:spring-boot-starter-validation에는 다음과 같은 의존관계가 있습니다.org.glassfish:jakarta.el그리고.org.hibernate.validator:hibernate-validator.그리고나서,org.hibernate.validator:hibernate-validator가지다jakarta.validation:jakarta.validation-api.

여기에 이미지 설명 입력

hibernate-validator의 의존성을 버전보다 다운그레이드했습니다.7.0.2.Final로.6.0.13.Final.

의존관계는 다음과 같습니다.

    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>2.0.1.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate.validator</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>6.0.13.Final</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.el</artifactId>
        <version>3.0.0</version>
    </dependency>

Hibernate Validator와 같은 검증 제공자 종속성을 추가해야 합니다.

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.2.1.Final</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator-annotation-processor</artifactId>
    <version>5.2.1.Final</version>
</dependency>

휴지 상태 검증기를 사용하려면 제약 조건 위반 메시지에서 동적 식을 평가하려면 자카르타 표현 언어를 구현해야 합니다.

응용 프로그램이 JBoss Application Server와 같은 Java EE 컨테이너에서 실행되는 경우 컨테이너에서 EL 구현이 이미 제공됩니다.

단, Java SE 환경에서는 POM 또는 그래들파일에 의존하여 구현을 추가해야 합니다.

예를 들어 자카르타 EL 참조 구현을 사용하기 위해 다음과 같은 종속성을 추가할 수 있습니다.

메이븐

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

또는 gradle

implementation 'org.glassfish:jakarta.el:4.0.2'

휴지 상태 검증자 문서

프로젝트에서 spring-boot-starter-validation을 사용하는 경우 hibernate-validator와 jakarta.el은 이미 지정된 스타터의 의존관계에 있습니다.

스프링 부트 검증

spring-boot-starter 의존관계를 사용하는 경우 검증을 위해 다른 의존관계를 추가하는 것이 좋습니다.

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

2022년 6월에는 다음과 같은 이점이 있습니다.

pom.xml

<dependencies>
...
        <!-- https://mvnrepository.com/artifact/jakarta.el/jakarta.el-api -->
        <dependency>
            <groupId>org.glassfish</groupId>
            <artifactId>jakarta.el</artifactId>
            <version>4.0.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator-annotation-processor -->
        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>7.0.4.Final</version>
        </dependency>
...
</dependencies>

클래스 내 Import:

import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
...

일부 버전에서는 Guice 및/또는 Reactor.io과 호환되지 않는 것 같습니다.Spring Boot WebFlux 솔루션에서는 다음과 같이 동작했습니다.

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
</dependency>
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator-annotation-processor</artifactId>
</dependency>
<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>jakarta.el</artifactId>
</dependency>
import static org.assertj.core.api.Assertions.assertThat;

import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import javax.validation.constraints.Pattern;
import lombok.Data;
import org.junit.jupiter.api.Test;

public class ValidationTests {

    @Test
    public void validate(){
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();
        Foo foo = new Foo();
        foo.setName("7of9");
        assertThat(validator.validate(foo).size()).isNotZero();
    }

    @Data
    class Foo{

        @Pattern(regexp = "[a-zA-Z]", message = "Only letters allowed")
        private String name;

    }
}

그렇지 않으면 보고된 것과 동일한 오류가 발생하거나 빌드 오류가 발생합니다(Guice는 클래스 경로에서 제외됩니다).

내 경우 다음 종속성을 추가하는 데 도움이 되었습니다.

        <dependency>
            <groupId>jakarta.validation</groupId>
            <artifactId>jakarta.validation-api</artifactId>
            <version>3.0.1</version>
        </dependency>

스프링 부트 2.6 서비스를 버전 3.0.1로 이행할 때 동일한 오류가 발생합니다.휴지 상태 검증기 및 이 게시물에 언급된 기타 libs 추가.

buildscript {
    ext {
        kotlinVersion = '1.6.0'
        groovyVersion = '3.0.13'
        groovySpockVersion = '2.4-M1-groovy-3.0'        
        springBootVersion = '3.0.1'
        springSecurityVersion = '2.6.8'
        springDocVersion = '1.5.12'
        hibernateValidatorVersion = '8.0.0.Final'
        javaxElApiVersion = '3.0.0'
        javaxElVersion = '2.0.1.Final'
        javaxElImplVersion = '2.2.6'        
...
    }
...
    implementation("javax.el:javax.el-api:${javaxElApiVersion}")
    implementation("javax.validation:validation-api:${javaxElVersion}")
    implementation("org.glassfish.web:javax.el:${javaxElImplVersion}")
    implementation("org.hibernate:hibernate-validator:${hibernateValidatorVersion}")
    implementation("org.hibernate:hibernate-validator-annotation-processor:${hibernateValidatorVersion}")
    implementation("org.springframework.boot:spring-boot-starter-web") {
        exclude module: 'spring-boot-starter-tomcat'
    }
    implementation("org.springframework.boot:spring-boot-starter-validation")
...

POM에 다음과 같은 의존관계를 추가하면 됩니다.XML의 경우 Spring-boot v3, Java 17

<dependency>
        <groupId>org.hibernate.validator</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>8.0.0.Final</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.expressly</groupId>
        <artifactId>expressly</artifactId>
        <version>5.0.0</version>
    </dependency>

자세한 내용은 다음 문서를 참조하십시오. Jboss 설명서

이 경우 검증자는 필요 없기 때문에 삭제해도 휴지 상태-검증기 의존관계 없이 오류가 제거됩니다.정기적인 테스트는 정상적으로 실행됩니다.

public class Test 
{

    public  ObjectMapper mapper;
    public  Validator validator;                //remove
    public  ValidatorFactory validatorFactory;  //remove

    @Before
    public void setUp() {
        mapper = new ObjectMapper();
        validatorFactory = Validation.buildDefaultValidatorFactory();  //remove
        validator = validatorFactory.getValidator();                   //remove
    }
  ...
}

언급URL : https://stackoverflow.com/questions/36329001/unable-to-create-a-configuration-because-no-bean-validation-provider-could-be-f