gpt4 book ai didi

java - spring-mvc @Size 注解无法正确解析错误消息

转载 作者:行者123 更新时间:2023-12-01 22:07:19 26 4
gpt4 key购买 nike

我正在尝试使用Spring中的Validator和ValidationMessages.properties来定义javax注释中定义的错误消息(@NotNull@Size ETC)。但是,打印的是原始字符串(如“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 将消息查找委托(delegate)给已配置的 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\ 中。

关于java - spring-mvc @Size 注解无法正确解析错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32450232/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com