복붙노트

[SPRING] 스프링 부트 유효성 검사 메시지가 해결되지 않습니다.

SPRING

스프링 부트 유효성 검사 메시지가 해결되지 않습니다.

유효성 검사 메시지를받는 데 문제가 있습니다.

나는 몇 시간 동안 웹을 검색하고 독서를 해왔다. 나는 스프링 유효성 검사 오류 맞춤 설정과 관련된 질문과 관련된 질문을하고 싶다.

MessageSource bean을 정의하고 messages.properties를 올바르게 읽었습니다. 보통 텍스트를 표시하기 위해 그것을 text : "# {some.prop.name}"과 함께 표시하면됩니다. 유효성 검사 오류 일 뿐이므로 작동하지 않습니다. 내가 간과하는 어리석은 실수라고 확신한다. 검증 자체가 잘 작동합니다.

강제:

@NotEmpty(message="{validation.mail.notEmpty}")
@Email()
private String mail;

messages.properties:

# Validation
validation.mail.notEmpty=The mail must not be empty!

템플릿 부분 :

<span th:if="${#fields.hasErrors('mail')}" th:errors="*{mail}"></span>

표시된 텍스트 :

{validation.mail.notEmpty}

나는 변이를 시도했는데 성공하지 못했습니다.

@NotEmpty(message="validation.mail.notEmpty")
@NotEmpty(message="#{validation.mail.notEmpty}")

그냥 메시지 문자열의 정확한 값을 표시하고 구문 분석하지 않습니다.

<span th:if="${#fields.hasErrors('mail')}" th:errors="${mail}"></span>
<span th:if="${#fields.hasErrors('mail')}" th:errors="#{mail}"></span>
<span th:if="${#fields.hasErrors('mail')}" th:errors="#{*{mail}}"></span>
<span th:if="${#fields.hasErrors('mail')}" th:errors="#{__*{mail}__}"></span>

오류가 발생합니다.

편집하다:

디버깅 후, 나는 이것에 비틀 거렸다 :

클래스 : org.springframework.context.support.MessageSourceSupport

메소드 : formatMessage (String msg, Object [] args, Locale locale)

~와 함께 부름 받음

formatMessage ( "{validation.mail.notEmpty}", null, locale / * 독일어 로켈 * /)

그리고 if (messageFormat == INVALID_MESSAGE_FORMAT) {

그래서 ... 내 메시지 형식이 올바르지 않습니다. 이것은 내 범위 / 지식에서 벗어나는 방법입니다. 그게 무슨 뜻인지 아는 사람?

해결법

  1. ==============================

    1.응용 프로그램 구성에서 LocalValidatorFactoryBean 정의가 누락 된 것 같습니다. 아래에는 두 개의 빈을 정의하는 Application 클래스의 예가 나와 있습니다. LocalValidatorFactoryBean과 messages.properties 파일을 사용하는 MessageSource입니다.

    응용 프로그램 구성에서 LocalValidatorFactoryBean 정의가 누락 된 것 같습니다. 아래에는 두 개의 빈을 정의하는 Application 클래스의 예가 나와 있습니다. LocalValidatorFactoryBean과 messages.properties 파일을 사용하는 MessageSource입니다.

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.MessageSource;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.support.ReloadableResourceBundleMessageSource;
    import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
    
    @SpringBootApplication
    public class Application {
    
        @Bean
        public MessageSource messageSource() {
            ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
            messageSource.setBasename("classpath:messages");
            messageSource.setDefaultEncoding("UTF-8");
            return messageSource;
        }
    
        @Bean
        public LocalValidatorFactoryBean validator() {
            LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
            bean.setValidationMessageSource(messageSource());
            return bean;
        }
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
    

    LocalValidatorFactoryBean Bean을 정의하면 다음과 같은 사용자 정의 유효성 검사 메시지를 사용할 수 있습니다.

    @NotEmpty(message = "{validation.mail.notEmpty}")
    @Email
    private String email;
    

    및 messages.properties :

    validation.mail.notEmpty=E-mail cannot be empty!
    

    Thymeleaf 템플릿 파일 :

    <p th:if="${#fields.hasErrors('email')}" th:errors="*{email}">Name Error</p>
    

    문제를 반영한 ​​샘플 Spring Boot 애플리케이션을 준비했습니다. 복제하여 로컬에서 실행하십시오. 양식과 함께 게시 된 값이 @NotEmpty 및 @Email 유효성 검사를 충족시키지 않으면 변환 된 유효성 검사 메시지가 표시됩니다.

    WebMvcConfigurerAdapter를 확장하는 경우 상위 클래스에서 getValidator () 메서드를 재정 의하여 유효성 검사기를 제공해야합니다 (예 :

    import org.springframework.context.MessageSource;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.support.ReloadableResourceBundleMessageSource;
    import org.springframework.validation.Validator;
    import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
    import org.springframework.web.servlet.config.annotation.EnableWebMvc;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
    
    @Configuration
    @EnableWebMvc
    public class WebConfiguration extends WebMvcConfigurerAdapter {
    
        @Bean
        public MessageSource messageSource() {
            ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
            messageSource.setBasename("classpath:messages");
            messageSource.setDefaultEncoding("UTF-8");
            return messageSource;
        }
    
        @Bean
        @Override
        public Validator getValidator() {
            LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
            bean.setValidationMessageSource(messageSource());
            return bean;
        }
    
        // other methods...
    }
    

    그렇지 않으면 다른 곳에서 LocalValidatorFactoryBean bean을 정의하면 재정의되고 아무 효과가 없습니다.

    도움이되기를 바랍니다.

  2. ==============================

    2.사용중인 스프링 부트의 버전이 확실하지 않습니다. 나는 봄 부팅 2.0.1.RELEASE를 사용하고있다. 명확한 해결책은 모든 유효성 검사 메시지를 ValidationMessages.properties로 옮기는 것입니다. 이렇게하면 자동으로 구성된 Validator ()를 재정의하고 MessageSource를 설정할 필요가 없습니다.

    사용중인 스프링 부트의 버전이 확실하지 않습니다. 나는 봄 부팅 2.0.1.RELEASE를 사용하고있다. 명확한 해결책은 모든 유효성 검사 메시지를 ValidationMessages.properties로 옮기는 것입니다. 이렇게하면 자동으로 구성된 Validator ()를 재정의하고 MessageSource를 설정할 필요가 없습니다.

  3. from https://stackoverflow.com/questions/45692179/spring-boot-validation-message-is-not-being-resolved by cc-by-sa and MIT license