我无法解决我的验证消息。
我确实MessageSource定义了一个bean,并且正确读取了它的 messages.properties ,因为我也将它用于与一起显示的常规文本th:text="#{some.prop.name},这确实工作得很好。只是验证错误无法正常工作。我确定这是一个愚蠢的错误,我只是忽略了……验证本身运行良好。
MessageSource
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
org.springframework.context.support.MessageSourceSupport
方法: formatMessage(String msg, Object[] args, Locale locale)
formatMessage(String msg, Object[] args, Locale locale)
将被称为
formatMessage("{validation.mail.notEmpty}", null, locale /*German Locale*/)
它会遇到 if (messageFormat == INVALID_MESSAGE_FORMAT) {
if (messageFormat == INVALID_MESSAGE_FORMAT) {
所以…我的邮件格式不正确。这超出了我的范围/知识。有人知道这意味着什么吗?
您似乎LocalValidatorFactoryBean在应用程序配置中缺少定义。在下面,您可以找到Application定义两个bean 的类的示例:LocalValidatorFactoryBean并且MessageSource使用messages.properties文件。
LocalValidatorFactoryBean
Application
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验证,它将显示翻译的验证消息。
@NotEmpty
@Email
WebMvcConfigurerAdapter
如果要扩展WebMvcConfigurerAdapter,则必须通过重写getValidator()父类的方法来提供验证器,例如:
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,它将被覆盖,并且将无效。
希望对您有所帮助。