1

我正在使用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 服务,我希望messages将上面的 JSON 中的值替换为ValidationMessages.properties.

MyValidationMessages.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}

4

1 回答 1

1

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

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

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

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

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

于 2015-12-23T20:02:11.977 回答