我正在尝试使用MessageSource
检索默认验证错误消息。我正在使用的代码使用反射来检索message
参数的值。在不覆盖message
参数的约束上,我想检索默认错误消息。当我在验证注释上调用message
方法时,我得到{org.hibernate.validator.constraints.NotBlank.message}
(例如,对于@NotBlank
注释)。然后我尝试使用MessageSource
来获取错误消息,如下所示:
String message = messageSource.getMessage(key, null, Locale.US);
我尝试将key
设置为{org.hibernate.validator.constraints.NotBlank.message}
,org.hibernate.validator.constraints.NotBlank.message
(删除大括号)甚至org.hibernate.validator.constraints.NotBlank
,但我不断获得null
。我在这里做错了什么?
更新
澄清。我的印象是Spring为其约束提供了一个默认的message.properties
文件。我在这个假设中是否正确?
更新
更改问题的名称,以更好地反映我的目标。
答案 0 :(得分:1)
从一个Hibernate人员跑进blog post后,在Hibernate Validator源码中挖掘后,我想我已经弄明白了:
public String getMessage(Locale locale, String key) {
String message = key;
key = key.toString().replace("{", "").replace("}", "");
PlatformResourceBundleLocator bundleLocator = new PlatformResourceBundleLocator(ResourceBundleMessageInterpolator.DEFAULT_VALIDATION_MESSAGES);
ResourceBundle resourceBundle = bundleLocator.getResourceBundle(locale);
try {
message = ResourceBundle.getString(key);
}
catch(MissingResourceException ) {
message = key;
}
return message;
}
首先,您必须使用默认验证消息实例化PlatformResourceBundleLocator
。然后从定位器中检索ResourceBundle
并使用它来获取您的消息。我不相信这会执行任何插值。为此你必须使用插值器;我上面链接的博客文章详细介绍了这一点。
<强>更新强>
另一种(更简单)方法是更新applicationContext.xml
并执行此操作:
<bean id="resourceBundleSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>org.hibernate.validator.ValidationMessages</value>
</list>
</property>
</bean>
现在您的MessageSource
已填充默认消息,您可以执行messageSource.getMessage()
。事实上,这可能是最好的方式。
答案 1 :(得分:0)
Spring Boot 2.4.5
万一有人需要这个进行测试:
package some.package;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.Locale;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.context.MessageSource;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
public class NotNullTest {
private static MessageSource ms;
private static String VAL_MSG_NOT_NULL;
@BeforeAll
static void setUpClass() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("org/hibernate/validator/ValidationMessages");
messageSource.setDefaultEncoding("UTF-8");
ms = messageSource;
}
@BeforeEach
void setUp() {
VAL_MSG_NOT_NULL = ms.getMessage("javax.validation.constraints.NotNull.message", null, Locale.ROOT);
assertThat(VAL_MSG_NOT_NULL).isNotNull();
assertThat(VAL_MSG_NOT_NULL).isNotBlank();
}
@Test
void test() {
assertThat(VAL_MSG_NOT_NULL).isEqualTo("must not be null");
}
}