Spring Boot验证消息未解决
我无法解决我的验证消息。
我确实MessageSource
定义了一个bean,并且正确读取了它的 messages.properties
,因为我也将它用于与一起显示的常规文本th:text="#{some.prop.name}
,这确实工作得很好。只是验证错误无法正常工作。我确定这是一个愚蠢的错误,我只是忽略了……验证本身运行良好。
约束:
@NotEmpty(message="{validation.mail.notEmpty}")@Email()
private String mail;
messages.properties:
# Validationvalidation.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
定义两个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;
和 :
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
,则必须通过重写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,它将被覆盖,并且将无效。
希望对您有所帮助。
以上是 Spring Boot验证消息未解决 的全部内容, 来源链接: utcz.com/qa/399234.html