小编典典

Spring Boot验证消息未解决

spring-boot

我无法解决我的验证消息。

我确实MessageSource定义了一个bean,并且正确读取了它的 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) {

所以…我的邮件格式不正确。这超出了我的范围/知识。有人知道这意味着什么吗?


阅读 373

收藏
2020-05-30

共1个答案

小编典典

您似乎LocalValidatorFactoryBean在应用程序配置中缺少定义。在下面,您可以找到Application定义两个bean
的类的示例: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豆定义您可以使用自定义的验证信息,如:

@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>

样品申请

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在其他位置定义bean,它将被覆盖,并且将无效。

希望对您有所帮助。

2020-05-30