Spring Boot 검증 메시지가 해결되지 않음
확인 메시지를 해결할 수 없습니다.
몇 시간 동안 웹 및 SO를 검색 및 읽고 있습니다. 이 질문에 표시된 답변과 "Customize spring validation error(스프링 검증 오류 사용자 지정)"를 연결하려고 합니다.
나는 가지고 있다.MessageSource
bean defined 및 messages.properties가 올바르게 읽혀지는 것은 일반 텍스트에도 사용하기 때문입니다.th: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 /*German Locale*/)
그리고 그것은 에 부딪힐 것이다.if (messageFormat == INVALID_MESSAGE_FORMAT) {
그래서... 내 메시지 형식이 틀렸어.이것은 내 범위/지식을 훨씬 벗어난다.그게 무슨 뜻인지 아는 사람?
네가 없어진 것 같아LocalValidatorFactoryBean
응용 프로그램 구성에 정의되어 있습니다.이하에 예를 제시하겠습니다.Application
두 개의 콩을 정의하는 클래스:LocalValidatorFactoryBean
그리고.MessageSource
는 를 사용합니다.messages.properties
파일.
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!
및 Tymeleaf 템플릿 파일:
<p th:if="${#fields.hasErrors('email')}" th:errors="*{email}">Name Error</p>
샘플 어플리케이션
https://github.com/wololock/stackoverflow-answers/tree/master/45692179
고객님의 문제를 반영한 Spring Boot 어플리케이션 샘플을 준비했습니다.자유롭게 복제하여 로컬로 실행하세요.폼과 함께 게시된 값이 충족되지 않으면 번역된 확인 메시지가 표시됩니다.@NotEmpty
그리고.@Email
확인.
WebMvcConfigurerAdapter
배열
연장하는 경우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
다른 곳에 있는 콩은 덮어쓰게 되고 효과가 없습니다.
도움이 됐으면 좋겠어요.
어떤 버전의 스프링 부트를 사용하고 있는지 알 수 없습니다.스프링 부츠를 사용하고 있습니다.2.0.1.RELEASE
보다 명확한 해결책은 모든 검증 메시지를 다음 주소로 이동하는 것입니다.ValidationMessages.properties
이렇게 하면 자동 구성 기능을 덮어쓸 필요가 없습니다.Validator()
을 합니다.MessageSource
.
2.2.7 Release of Spring 부트를 사용하고 있는데 속성 파일명을 ValidationMessages.properties로 변경하기만 하면 동작합니다.다른 설정은 필요 없습니다.
저도 같은 문제가 있었습니다만, 여기의 답변을 읽고 나서, 파일명이 「Validation Messages.properties」라고 하는 것을 알았습니다.처음에 다른 이름을 붙였는데 나한테도 안 통했어.이름을 ValidationMessages.properties로 바꿀 때까지
Wais Shuja와 Ramesh Singh의 답변에 대해 저는 이것이 당신이 찾고 있는 적절한 해결책이라고 생각하기 때문에 그것을 확인합니다.나는 그들의 대답을 확장한다.
★★★★★★/resources/
지원하는 언어만큼 파일을 만들 수 있습니다.내 웹 앱은 독일어와 영어를 사용합니다.따라서 다음 두 개의 파일을 만듭니다.
- ValidationMessages_en.properties
- ValidationMessages_de.properties
그리고 Spring Magic 덕분에 다음과 같은 작업을 수행할 수 있습니다.
@NotNull(message = "{error.mandatory}")
@Size(min = 1, message = "{error.mandatory}")
private String forname;
에 되어 있는 .CookieLocaleResolver
스프링은 적절한 파일을 선택하고 텍스트를 삽입합니다.
나머지 컨트롤러의 경우 메서드 파라미터의 요청 본문에 @Valid 주석을 추가해야 합니다.예
@PostMapping
public User create(@Valid @RequestBody User user){
//...
}
@Configuration
public class LocalizationMessageSource {
@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;
}
}
그리고 다음과 같은 빈 beyween 메시지 파라미터로 anotation을 검증해야 합니다.
public class User{
private @NotNull(message = "{serviceNumber.required}") String serviceNumber;
}
이것은 잘못된 사용법입니다.
public class User{
private @NotNull(message="{serviceNumber.required}") String serviceNumber;
}
이 문제와 씨름한 후 컴퓨터를 재부팅하면 모든 것이 정상적으로 작동합니다.스프링 부트 버전 2.4.2를 사용하고 있습니다.
언급URL : https://stackoverflow.com/questions/45692179/spring-boot-validation-message-is-not-being-resolved
'programing' 카테고리의 다른 글
angularjs 1.x는 라이프 사이클과 수명을 지원합니다. (0) | 2023.02.25 |
---|---|
Oracle 시퀀스를 기존 열의 다음 값으로 리셋하는 가장 좋은 방법은 무엇입니까? (0) | 2023.02.25 |
Angular를 사용하는 모범 사례는 무엇입니까?JS(장고 포함 (0) | 2023.02.25 |
미디어 유형=application/json에 대한 MessageBodyReader를 찾을 수 없습니다. (0) | 2023.02.25 |
jeast --coverage를 실행할 때 Branchs 열은 무엇을 의미합니까? (0) | 2023.02.25 |