【问题标题】:How to add custom error messages in Hibernate validator如何在 Hibernate 验证器中添加自定义错误消息
【发布时间】:2011-08-17 13:12:58
【问题描述】:

我有一个像这样的简单课程,

import javax.validation.constraints.NotNull;
import org.hibernate.validator.constraints.Length;

public class Form implements Serializable {
   @NotNull
   @Length(min = 2, max = 20)
   private String lastName;
}

我在类路径中有 messages.properties 文件。然后通过 Spring bean 加载如下,

<bean name="validator"
      class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
    <property name="validationMessageSource">
        <ref bean="resourceBundleLocator"/>
    </property>
</bean>

<bean name="resourceBundleLocator" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basenames">
        <list>
            <value>classpath*:messages.properties</value>
        </list>
    </property>
</bean>

我想要的只是根据经过验证的 bean 获得自定义的错误消息。换句话说,我想让每个 ConstraintViolation 对象返回我在属性文件中定义的错误消息,而不是默认的。是否可以添加具有这种格式 {xxx.yyyy.zzzz} 的值的消息属性并从 messages.properties 文件中引用该消息?

ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    Validator validator = factory.getValidator();
    Set<ConstraintViolation<Form>> inputErrors = validator.validate(form); 

如果我想自定义@NotNull 和@Length 的默认消息,我该怎么做?

我在 Hibernate 验证方面的经验,任何示例代码或分步指南都将不胜感激。

【问题讨论】:

    标签: hibernate-validator


    【解决方案1】:

    您拥有保存消息值的资源包文件。

    我认为您必须使用指向 @NotNull 注释的路径 手动覆盖消息! 喜欢javax.validation.constraints.NotNull=Notnull error happened! 或类似的东西!

    看这里:

    Hibernate Validator - The error message

    希望有帮助

    【讨论】:

    • 是的 fritz,这是真的,但我不想覆盖默认的 messageTemplate 路径,因为我的 Form 类中有许多 @NotNull(当然还有其他注释)。我想为每个属性添加特定的错误消息。有没有一种简单的方法无需实现自定义 MessageInterpolator。我发现了几个自定义消息插值器实现,但我不明白其中的任何一个。如果你能给我一个完整的源代码的最简单的解决方案!。
    • 我还尝试使用类似 {vvvv.ssss.rrrt.message} 的格式覆盖每个验证注释的消息属性,但是当我调用 ConstraintViolation 的 getMessage 时,它​​会按原样打印,而不是它的消息。
    • 我明白了!我想到的唯一方法是创建一个包含消息的自定义验证器!喜欢@MyNotNull + 消息?!或者你可以做这样的事情`ValidatorFactory factory = Validation.buildDefaultValidatorFactory();验证器验证器 = factory.getValidator();汽车 car = new Car(null); Set> constraintViolations = validator.validate(car); assertEquals(1, constraintViolations.size()); assertEquals("可能不为空", constraintViolations.iterator().next().getMessage()); `并拦截对象中的消息!?
    • 好的,我可能疯了,为此道歉。无论如何我都必须这样做,有没有办法获取messages.properties文件中定义的消息(键和值对)?如果是这样,我可以选择您之前提到的第二个选项。
    • 是的!别介意这是一项棘手的任务!试试stackoverflow.com/questions/3372569/… 你在用什么框架。 @Autowired 私有 ApplicationContext 上下文; context().getMessage("key", null, Locale.getDefault());如果您使用的是spring,类似的东西可以完成这项工作!
    猜你喜欢
    • 2012-05-07
    • 1970-01-01
    • 2017-05-30
    • 2023-02-08
    • 1970-01-01
    • 2019-04-21
    • 2011-10-12
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多