gpt4 book ai didi

javax bean 验证无法解析消息代码

转载 作者:行者123 更新时间:2023-11-30 07:38:04 25 4
gpt4 key购买 nike

我在 spring mvc 项目中使用 javax bean 验证。这是我的示例代码。

用户.java :-

@NotEmpty(message = "{error.user.username.empty}")
private String userName;

UserController.java:-

public String handleSubmission(@ModelAttribute("user")@Valid User user, BindingResult errors) {
....
}

messages_en.properties:-

error.user.username.empty=Username can not be empty
NotEmpty.user.userName=Username can not be empty

只要“userName”字段为空,验证就会按预期失败,但应用程序会引发异常,

Caused by: javax.servlet.jsp.JspTagException: No message found under code 'NotEmpty' for locale 'en_US'.

在日志中我可以看到,

Field error in object 'user' on field 'userName': rejected value []; codes [NotEmpty.user.userName,NotEmpty.userName,NotEmpty.java.lang.String,NotEmpty]; 
arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.userName,userName]; arguments []; default message [userName]]; default message [Username cannot be empty]

验证注释中使用的消息键是“error.user.username.empty”,该键在 messages_en.properties 中定义,但应用程序仅查看对于键“NotEmpty”。即使添加键“NotEmpty.user.userName”也无济于事。仅当我将“NotEmpty”键添加到属性文件时,异常才会消失,例如

NotEmpty=Username can not be empty

MessageSource配置如下,

@Configuration
@EnableWebMvc
public class AppConfig extends WebMvcConfigurerAdapter {
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("messages");
return messageSource;
}
}

显示错误消息的 JSP 代码是,

用户.jsp:-

<spring:hasBindErrors name="user">
<ul>
<li> <span class="error">Please fix all errors and try again.</span></li>
<c:forEach var="error" items="${errors.allErrors}">
<li> <span class="error"><spring:message code="${error.code}"/></span></li>
</c:forEach>
</ul>
</spring:hasBindErrors>

更新:-

即使有 - <form:errors path="userName"/>. 也不走运

我只是使用以下代码在 JSP 中显示错误代码和默认错误消息,

<spring:hasBindErrors name="user">
<c:forEach var="error" items="${errors.allErrors}">
<span class="error">${error.code} - ${error.defaultMessage}</span>
</c:forEach>
</spring:hasBindErrors>

输出是,

NotEmpty - Username cannot be empty

这意味着可以从 ValidationMessages.properties 文件中正确读取 defaultMessage“用户名不能为空”。因为那是那里定义的消息。但错误代码仍然是“NotEmpty”。综上所述,

  1. 如果我尝试通过迭代所有错误来显示消息(如上面的 JSP 代码所示),则会出现异常。
  2. 如果我使用<form:errors path="*" />除了 javax bean 验证消息之外,都会显示 bean“user”的所有错误消息。
  3. 使用<form:errors path="userName" />不显示任何内容。

最佳答案

在类路径中创建一个名为 ValidationMessages.properties 的文件,并在其中添加验证错误消息。

更新自定义您的Validator以使用注册的MessageSource:

@Configuration
@EnableWebMvc
public class AppConfig extends WebMvcConfigurerAdapter {
@Override
public Validator getValidator() {
return validator();
}

@Bean
public LocalValidatorFactoryBean validator() {
LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
bean.setValidationMessageSource(messageSource());

return bean;
}

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

关于javax bean 验证无法解析消息代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35085379/

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