[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.응용 프로그램 구성에서 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.0.1.RELEASE를 사용하고있다. 명확한 해결책은 모든 유효성 검사 메시지를 ValidationMessages.properties로 옮기는 것입니다. 이렇게하면 자동으로 구성된 Validator ()를 재정의하고 MessageSource를 설정할 필요가 없습니다.
사용중인 스프링 부트의 버전이 확실하지 않습니다. 나는 봄 부팅 2.0.1.RELEASE를 사용하고있다. 명확한 해결책은 모든 유효성 검사 메시지를 ValidationMessages.properties로 옮기는 것입니다. 이렇게하면 자동으로 구성된 Validator ()를 재정의하고 MessageSource를 설정할 필요가 없습니다.
from https://stackoverflow.com/questions/45692179/spring-boot-validation-message-is-not-being-resolved by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 사용자 지정 인증 공급자가 호출되지 않음 (0) | 2019.03.15 |
---|---|
[SPRING] 문자 인코딩 문제 스프링 (0) | 2019.03.15 |
[SPRING] Spring mvc 모호한 매핑이 발견되었습니다. 컨트롤러 bean 메소드를 맵핑 할 수 없습니다. (0) | 2019.03.14 |
[SPRING] AsyncRestTemplate HTTP 요청을 너무 오래 걸리는 경우이를 취소하는 방법? (0) | 2019.03.14 |
[SPRING] 제어 반전과 의존성 주입의 차이점 [중복] (0) | 2019.03.14 |