【问题标题】:Spring MVC <form:errors /> not showing error message from properties fileSpring MVC <form:errors /> 不显示来自属性文件的错误消息
【发布时间】:2020-11-04 12:54:23
【问题描述】:

尝试在 Spring MVC 中验证表单时遇到了一些问题。下面作为我的控制器类:

@RequestMapping(value = "/search.do", params ="doImageExtract", method = { RequestMethod.POST })
    public String doImageExtract(Model model, @ModelAttribute("attendanceTO") @Valid AttendanceTO attendanceSearchForm,
            BindingResult bindingResult) {
        
        log.debug("doImageExtractSearchList(): bindingResult has error " + bindingResult.hasErrors());
        if (bindingResult.hasErrors())
            return "search";
}

在我的 JSP 中:

<form:form action="search.do" method="POST" modelAttribute="attendanceTO">
<table>
<td align="left"><form:input path="dteEnlist" maxlength="10" /></td>
<td align="left"><form:errors path="dteEnlist" class="errorClass" /></td>
</table>
</form:form>

在我的 TO 课上:

@NotNull
@DateTimeFormat(pattern = "dd/MM/yyyy")
private String dteEnlist;

在我的属性文件中:

NotNull.attendanceTO.dteEnlist = Enlistment Date is required.
DateTimeFormat.attendanceTO.dteEnlist = Enlistment Date must be in dd/MM/yyy format.

我尝试在控制器中检查 bindingResult.hasErrors(),它确实返回了 true。但是,错误消息没有显示在 JSP 中。

我已将 validation-api-2.0.1.Final.jar 作为库导入到我的项目中。

有什么想法吗?谢谢!

编辑

<bean id="messageSource"
        class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="/WEB-INF/properties/messages" />
        <property name="defaultEncoding" value="UTF-8" />
    </bean>
    
    <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <property name="validationMessageSource" ref="messageSource"/>
    </bean>

【问题讨论】:

    标签: java validation spring-mvc jsp


    【解决方案1】:

    默认情况下,如果您将验证消息保存在ValidationMessages.properties 中,它应该会在春季自动使用,无需任何配置。将您的属性文件保存在src/main/resources 下。如果您将消息保存在不同的文件中,例如messages.properties,并为您的验证消息使用不同的密钥,那么您可以这样做:

    @NotNull(message="{validation.date.notEmpty}")
    @DateTimeFormat(pattern = "dd/MM/yyyy")
    private String dteEnlist;
    

    还有一个配置,比如将消息放在messages.properties 文件中:

    messages.properties

    validation.date.notEmpty =  Enlistment Date is required.
    

    然后提供配置以覆盖默认 bean,例如:

    @Configuration
    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...
    }
    

    【讨论】:

    • 您好,非常感谢!但是我可以和你核实一下如何将消息绑定到@DateTimeFormat 吗?因为当我尝试添加消息时,它会出现语法错误
    • 另外,我根据 dispatcher-servlet.xml 中的 EDIT 部分进行了配置。我设法从属性文件中读取了一些文本标签消息,因此验证也应该能够从文件中读取。但是,它仍然无法正常工作
    • @hyperfkcb 我认为对于 DateTimeFormat 注释,springboot 的默认错误消息键应该类似于属性文件中的typeMismatch=Please use MM/dd/yyyy format
    • 好的,非常感谢!其实我找到了另一个解决方案:howtodoinjava.com/spring-mvc/…我测试了它的工作原理,方法是定义rejectValue并将其设置为bindingResult
    • 但是这种方法会使TO类的注释变得无用
    猜你喜欢
    • 2016-01-07
    • 2012-11-08
    • 2015-02-21
    • 1970-01-01
    • 2012-04-28
    • 2014-09-23
    • 2018-04-28
    • 2014-10-17
    • 1970-01-01
    相关资源
    最近更新 更多