programing

Spring Boot 검증 메시지가 해결되지 않음

batch 2023. 2. 25. 20:08
반응형

Spring Boot 검증 메시지가 해결되지 않음

확인 메시지를 해결할 수 없습니다.

몇 시간 동안 웹 및 SO를 검색 및 읽고 있습니다. 이 질문에 표시된 답변과 "Customize spring validation error(스프링 검증 오류 사용자 지정)"를 연결하려고 합니다.

나는 가지고 있다.MessageSourcebean 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);
    }
}

하고 있다LocalValidatorFactoryBeanbean 정의에서는 다음과 같은 커스텀 검증 메시지를 사용할 수 있습니다.

@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

반응형