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而不是注释并手工完成,所以我只是问这个问题是否有一些优雅的捷径.
验证框架不负责提取正确的多态类型并对其进行验证.事实上,在验证开始的时候,对象已经被创建了.它只能与那时的工作一起使用.但请注意:
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)
| 归档时间: |
|
| 查看次数: |
2697 次 |
| 最近记录: |