【发布时间】:2013-02-16 03:21:36
【问题描述】:
假设 Animal 是我项目中的一个抽象类,我有一个 REST 资源(在 JAX-RS 服务器上,使用 Jackson 进行(反)序列化)用于 PUT 来操作存储在我的数据库。它们有具体的类型,REST 资源在请求的路径中指定了类型:
@PUT
@Consumes(MediaType.APPLICATION_JSON)
@Path("/{entityType}/{id: \\d+}")
public <T extends Animal> void putAnimal(@PathParam("entityType") String entityType, @PathParam("id") String id, Animal input) throws IOException {
//...
}
我想使用entityType 来选择要反序列化的具体类(Dog 或Cat 或其他,因为entityType 是dog 或cat 或其他)。由于此处无法解释的复杂原因,我无法将类型信息放入 JSON 输入本身。
所以 AIUI 用自定义 TypeIdResolver 或类似的东西注释 Animal 对我没有帮助,因为类型信息不会在 JSON 本身中(这就是类型解析器将获得的所有信息)。我打算使用自定义的MessageBodyReader,但据我所知,它没有从通过readValue 方法传递的主体中获取其他参数值,所以我不知道要反序列化成什么。
我错过了什么?如果这种方法失败,我如何在不指定特定于动物的端点的情况下完成我想要的(这会导致大量重复代码以及失去通用性 - 现在我可以添加Animal 的子类,这段代码将只是工作,非常好。)
【问题讨论】: