当前位置: 首页 > 知识库问答 >
问题:

在SpringMVC中访问预插值bean验证消息模板?

赏夕
2023-03-14

我正在Spring MVC应用程序中使用Spring验证,该应用程序将验证委托给Hibernate Validator 5。我成功地使bean经过验证并使消息由验证器插值。但是,重要的是我还可以访问消息模板本身,预插值。

例如在一些bean中,我有验证大小(最小值=5,最大值=15,message=“{my.custom.message}”。在消息属性文件中,我有条目my.custom.message=test min{min}和max{max}。在我的BindingResult中,我看到了带有错误消息“test min 5 and max 15”的ObjectError,但我需要根据非插值的my在这一点上查找一个值。风俗消息原始值。

这能做到吗?如果它不能开箱即用,有人能给我指出正确的方向,告诉我如何自定义Spring的LocalValidatorFactoryBean来保存它吗?

使现代化

我正在考虑扩展组织。springframework。验证。Bean验证。SpringValidatorAdapter,并包装getArgumentsForConstraint,将预插入的消息自动附加到返回的参数列表中。我不清楚这些“参数”到底是什么以及它们是如何使用的,但如果它纯粹用于消息插入,那么我在最后附加这些参数似乎相对安全。有什么原因可能不起作用吗?可能导致的问题?更好的想法?

解决方案

除了我上面的“更新”之外,没有找到任何好的解决方案,所以我最终用这个子类化了LocalValidatorFactoryBean

@Override
protected Object[] getArgumentsForConstraint(String objectName, String field, ConstraintDescriptor<?> descriptor) {
    if (null == descriptor) return super.getArgumentsForConstraint(objectName, field, descriptor);

    Object[] orig = super.getArgumentsForConstraint(objectName, field, descriptor);
    if (null == orig || orig.length < 1) return new Object[] { descriptor };

    Object[] retval = new Object[orig.length+1];
    System.arraycopy(orig, 0, retval, 0, orig.length);
    retval[retval.length-1] = descriptor;
    return retval;
}

在随后的代码中,我查看这个数组中的最后一个对象,并测试它是否是ConstraintDescriptor的实例。我想已经够好了。

共有1个答案

韩夕
2023-03-14

但是,重要的是我也能够访问消息模板本身,预插值。

您需要在哪个上下文中访问模板?如果是在验证之后,那么ConstraintViolation上的getMessageTemplate()将提供此信息。如果它在约束验证器实现中,那么您可以对ConstraintValidatorContext使用getDefaultConstraintMessageTemplate()

 类似资料:
  • 我试图理解spring中的验证消息和国际化机制,并编写了以下代码: Bean配置: 资源文件系统结构: 消息。属性: messages\u it。属性: 当我提交表单时,得到的错误消息是:{m1}。我是否缺少一些代码?

  • 我知道我们不能更改电子邮件验证模板或短信验证模板。 我已经设置了公共名称,它一直工作到日期。但是今天我得到了另一个文本而不是那个名称的OTP。 123345是你的验证码。egad5adfe/g 最后一个词egad5adfe/g是什么,为什么它代替了面向公众的名称? 最近几天我什么都没变。我不知道为什么会这样。有人能帮忙吗?

  • 我正在使用GF4进行bean验证。我试图在我的自定义验证器中 。例如: 消息_test={value}无效 以某种方式编织它,就像您可以静态地插入值一样,例如size_msg={min}-{max}超出范围。

  • 对于错误的响应,是否可能在响应中返回验证注释消息?我认为这是可能的,但我注意到我们的项目没有给出详细的不良请求信息。 如果请求缺少IDField,我希望返回“IDField is required”。我用的是泽西2.0。我看到的回应是...

  • 是否可以验证/筛选发送到Kafka主题的消息?

  • 我创建了一个Django表单: 在模型中,定义为 如果用户为宽度输入0,则Django在表单验证时返回的错误消息为 确保该值大于或等于0.05。 因此,它很好地包含了来自的值。我想把它改为“相对宽度必须是” 为了实现这一点,我尝试在addFaceForm Meta中自定义错误 但这意味着要硬编码0.05的值。我想从模型定义中读一下。如何做到这一点?