来自 ValidationMessages.properties 的消息已生成 JSON

Messages from ValidationMessages.properties in generated JSON

我正在使用 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}?

你不能,至少不能开箱即用。如果您检查 Bean Validation 规范或查看 Constraint Javadoc:

,原因就很明显了

Each constraint annotation must host the following attributes:

  • String message() default [...]; which should default to an error message key made of the fully-qualified class name of the constraint followed by .message. For example {com.acme.constraints.NotSafe.message}

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

中逐一提取的

因此,如果违反 Person.firstName.size 约束,您需要一种在 AngularJS 前端显示 "Must be between 2 and 2147483647 characters" 的方法。 valdr 通过 integrating well with angular-translate 实现了这一点。 您需要做的就是让您的 ValidationMessages.properties 可用于前端并使用该文件中的消息初始化 angular-translate。