Dropwizard 中的 Java 复杂验证?

标签 java json validation jax-rs dropwizard

我想在 REST 端点上接受 JSON 并将其转换为正确的类型以进行即时验证。

端点看起来像这样:

@POST
public Response createCar(@Valid Car car) { 
    // persist to DB
    // ... 
}

但是 Car 有很多子类,例如Van、SelfDrivingCar、RaceCar 等。我如何在端点上接受不同的 JSON 表示,同时保留验证码 在资源中像 @Valid Car car?

这样简洁

同样:我发送 JSON 格式(这里是 Car 的一个子类的表示,即 SelfDrivingCar):

{ 
    "id" : "t1",                      // every Car has an Id
    "kind" : "selfdriving",           // every Car has a type-hint
    "max_speed" : "200 mph",          // some attribute
    "ai_provider" : "fastcarsai ltd." // this is SelfDrivingCar-specific
}

我希望验证机制查看 kind 属性,创建适当子类的实例,例如SelfDrivingCar 并执行验证。

我知道我可以为所有类型的汽车创建不同的端点,但这似乎并不干。而且我知道我可以使用真正的 Validator 而不是注释并手动完成,所以我只是想问一下这个问题是否有一些优雅的捷径。

最佳答案

验证框架不负责提取正确的多态类型并对其进行验证。事实上,在开始验证时,对象已经创建。它只能与当时的情况一起使用。但请注意:

public Response createCar(@Valid Car car) {
    // ...
}

将对“car”的实际运行时类型调用验证。很明显,您要做的是确保 car 变量在运行时绑定(bind)到正确的类型。这是您的反序列化框架的职责。您将需要确定使用应用程序中使用的 JSON 库执行此操作的正确方法,但对于 Jackson,您将使用 @JsonTypeInfo 注释来确定多态类型的范围。

@JsonTypeInfo(use=Id.NAME, include=As.PROPERTY, property="kind")
public class Car implements Serializable {
}

关于Dropwizard 中的 Java 复杂验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13882958/

相关文章:

Java - 使用数组查找/打印最小值/最大值?

c# - ReadAsStringAsync 返回虚线描述

android - 如何将嵌套哈希表序列化/反序列化为 JSON?

javascript - 如何启用禁用的文本字段?

asp.net - 末尾接受多次 (.com) 的电子邮件 ID

java - 文件生成和文件内容验证的自动测试

java - 使用 Google Drive Api 上传文件

javascript - 使用欧芹 js 进行表单验证。字母数字和密码确认

java - 无法创建自己的方法来使用selenium的显式等待方法

arrays - 如何在 iOS Swift 中将值数组附加到 tableView 中?