繁体   English   中英

spring-mvc @Size注释无法正确解决错误消息

[英]spring-mvc @Size annotation does not resolve error message correctly

我想从春季使用验证与ValidationMessages.properties来定义的javax注解(定义错误消息@NotNull@Size等)。 但是,将打印原始字符串(例如“ Size.firstName.length”)而不是已解析的消息。 此外,tomcat显示警告,内容为

WARNING: ResourceBundle [/WEB-INF/messages/] not found for MessageSource: Can't find bundle for base name /WEB-INF/messages/, locale en_US

此外,我还在这里检查了类似的问题,但没有任何效果。 可以说这是一个简单的Person POJO。

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

public class User {

    @NotNull
    @Size(min = 2, max = 10, message = "Size.firstName.length")
    private String firstName;

    @NotNull
    @Size(min = 2, max = 10)
    private String lastName;

    public User() {};

    public User(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

...
}

和相关的配置相关的jsp文件如下,

WebConfig.java

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"spittr.web", "spittr.data"})
public class WebConfig extends WebMvcConfigurerAdapter {

    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        resolver.setExposeContextBeansAsAttributes(true);
        return resolver;
    }

    @Bean
    public MessageSource messageSource() {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        messageSource.setBasename("/WEB-INF/messages/");
        return messageSource;
    }

    @Bean
    public LocalValidatorFactoryBean validatorFactory() {
        LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean();
        factoryBean.setValidationMessageSource(messageSource());
        return factoryBean;
    }

    @Override
    public Validator getValidator() {
        return validatorFactory();
    }

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
}

registerForm.jsp

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf" %>
<%@ page session="false" %>

<html>
    <head>
        <title>Spittr</title>
        <link href="<c:url value="/resources/css/user.css" />" rel="stylesheet">
    </head>
    <body>
        <h1>Register</h1>
        <sf:form method="POST" commandName="user">
            First Name: <sf:input path="firstName"/>
                        <sf:errors path="firstName" cssClass="error"/><br/>
            Last Name: <sf:input path="lastName"/>
                       <sf:errors path="lastName" cssClass="error"/><br/>
            <input type="submit" value="Register">
        </sf:form>
    </body>
</html>

ValidationMessages.properties

firstName.size=First Name must be between {min} and {max} charatecters long.

而ValidationMessages.properties位于

- webapp
  - WEB-INF
    - messages
      - ValidationMessages.properties

因此,正如我所说,如果firstName无效,则不会呈现错误消息,并且会显示原始字符串“ Size.firstName.length”。

Spring将消息查找委托给已配置的MessageSource它不为此使用ValidationMessages.properties (这就是默认bean验证的作用!)。

但是,您的MessageSource的配置是错误的。 baseName应该是文件名,而不是目录。 接下来,您将使用ResourceBundleMessageSource ,它只能从classpath加载文件。 重新配置您的MessageSource

@Bean
public MessageSource messageSource() {
    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    messageSource.setBasename("messages");
    return messageSource;
}

现在,将您的ValidationMessages.properties重命名为messages.properties并将其放在src\\main\\resources\\

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM