如何从Hibernate Validator中检索默认验证消息?

时间:2010-07-30 14:46:38

标签: java spring validation

我正在尝试使用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文件。我在这个假设中是否正确?

更新

更改问题的名称,以更好地反映我的目标。

2 个答案:

答案 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");
  }
}