来自生成的JSON

时间:2015-12-23 09:00:57

标签: valdr-bean-validation

我正在使用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)中,并由杰克逊正确使用。这可以通过调用具有无效值的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}

1 个答案:

答案 0 :(得分:1)

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

,原因很明显
  

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

     
      
  • String message()默认[...];应该默认为由约束的完全限定类名构成的错误消息密钥   然后是.message。例如   {com.acme.constraints.NotSafe.message}
  •   

因此,在valdr约束中本质上"message" : "{javax.validation.constraints.Size.message}" JSON表示消息 key 而不是实际验证message。调用JSON属性messageKey以使IMO更清楚,但我们希望坚持使用Bean Validation术语。实际上,JSON中的所有属性都是从Bean验证Constraint中逐个提取的。

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