【问题标题】:Messages from ValidationMessages.properties in generated JSON生成的 JSON 中来自 ValidationMessages.properties 的消息
【发布时间】:2015-12-23 09:00:57
【问题描述】:

我正在使用ValidationRulesServlet 为我的 API 生成 valdr JSON。目前生成的 JSON 如下所示:

{
  "Person" : {
    "firstName" : {
      "size" : {
        "min" : 2,
        "message" : "{javax.validation.constraints.Size.message}",
        "max" : 2147483647
      },
      "required" : {
        "message" : "{javax.validation.constraints.NotNull.message}"
      }
    },
    "lastName" : {
      "size" : {
        "min" : 2,
        "message" : "{javax.validation.constraints.Size.message}",
        "max" : 20
      },
      "required" : {
        "message" : "{javax.validation.constraints.NotNull.message}"
      }
    }
  }
}

我将 Jersey 用于我的 REST 服务,我希望将上述 JSON 中的 messages 替换为来自 ValidationMessages.properties 的值。

我的 ValidationMessages.properties 位于类路径 (src/main/resources) 中,并且被 Jackson 正确使用。这可以通过调用具有无效值的 REST 端点来确认。这是一个示例响应:

[
  {
    "message": "Must be between 2 and 2147483647 characters",
    "messageTemplate": "{javax.validation.constraints.Size.message}",
    "path": "PersonServiceImpl.updatePerson.arg0.firstName",
    "invalidValue": ""
  }
]

ValidationMessages.properties中对应的消息是

javax.validation.constraints.Size.message = Must be between {min} and {max} characters

如何让 valdr JSON 从ValidationMessages.properties 输出消息,而不是例如{javax.validation.constraints.Size.message}?

【问题讨论】:

    标签: valdr-bean-validation


    【解决方案1】:

    你不能,至少不能开箱即用。如果您检查 Bean Validation 规范或查看 Constraint Javadoc,原因就很明显了:

    每个约束注解都必须包含以下属性:

    • 字符串消息()默认[...];它应该默认为由约束的完全限定类名组成的错误消息键 其次是.message。例如 {com.acme.constraints.NotSafe.message}

    因此,valdr 约束 JSON 中的 "message" : "{javax.validation.constraints.Size.message}" 本质上表示消息 key 而不是实际验证 message。 IMO 更明智的做法是调用 JSON 属性 messageKey 来说明这一点,但我们想坚持使用 Bean Validation 术语。事实上,JSON 中的所有属性都是从 Bean Validation Constraint 中一一提取的。

    因此,如果违反了Person.firstName.size 约束,您需要一种方法在 AngularJS 前端显示“必须介于 2 到 2147483647 个字符之间”。 valdr 通过integrating well with angular-translate 实现了这一点。 您需要做的就是让您的 ValidationMessages.properties 可用于前端,并使用该文件中的消息初始化 angular-translate。

    【讨论】:

    • 我担心是这样的。我明白你的意思,但仍然认为如果 Valdr 在定义时使用消息而不是键是有意义的。使用 Jersey,您甚至可以使用 Constraintmessage 属性作为实际消息,例如@Size(min = 2, message = "At least 2 characters")。如果 Valdr 以同样的方式使用这个属性,我会很高兴。
    • 确实如此。如果您在 Java 类中定义 Constraint#message,则消息将以 valdr JSON 而不是(默认)消息键结束。没有魔法,也没有特定于 Jersey 或 valdr,这就是 Java Bean Validation 的工作原理。如果您想查看代码,我们确实在github.com/netceteragroup/valdr-bean-validation/blob/master/… 对此进行了单元测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    相关资源
    最近更新 更多