Dropwizard中的Java复杂验证?

mik*_*iku 3 java validation json jax-rs dropwizard

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

端点如下所示:

@POST
public Response createCar(@Valid Car car) { 
    // persist to DB
    // ... 
}
Run Code Online (Sandbox Code Playgroud)

但是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
}
Run Code Online (Sandbox Code Playgroud)

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

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

Per*_*ion 5

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

public Response createCar(@Valid Car car) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

无论"汽车"的运行时类型是什么,都会调用验证.很明显,您要做的是确保car变量在运行时绑定到正确的类型.这是您的反序列化框架的责任.您需要确定使用应用程序中使用的JSON库执行此操作的正确方法,但是使用Jackson,您可以使用@JsonTypeInfo注释来确定多态类型的范围.

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