将复杂对象注入 Jersey 中的资源方法

Inject complex object into resource method in Jersey

我正在 Java 8 中开发 RESTful 服务。我的资源 class 中有以下方法,它响应 POST 请求。

@POST
public Response store(SomeType myInstance){ ... }

通常,如果可以直接映射 json 请求,则此 get 会顺利反序列化。但是,在这种情况下,SomeType 是一个复杂的对象,其中包含保存在数据库中的其他对象。

有没有办法捕获请求、确定类型、构建对象 SomeType 然后将其传递给 store 方法?我倾向于某种类型的中间件,但我不太确定依赖项将如何工作。

注意:出于安全原因,我可以使用的第 3 方包非常有限。所以我不能使用开箱即用的解决方案。

我认为您的用例可以通过 Jackson 的 CustomDeserializer 功能来解决。

  1. 一般方法是为每个需要支持的传入类型创建一个 class。前任。 SomeType1SomeType2SomeType3`。
  2. 所有这些 class 都应该扩展 SomeType 父 class。
  3. SomeType 父级 class 应该有一个 CustomDeserializer
  4. CustomDeserializer 中,您可以检查 json 字段以确定应将 json 反序列化为哪种类型。
  5. 然后可以使用JsonParser.readValueAs方法将json反序列化为想要的类型SomeType1,SomeType2, 或 SomeType3.
  6. 如果您需要从数据库中获取更多数据并填充 SomeType1SomeType2 的字段,以及SomeType3 您可以在处理程序中通过检查对象类型来做到这一点。

    @POST
    public Response store(SomeType myInstance) {
       if (myInstance instanceof SomeType1) {
         // fetch from database and populate more fields
       } else if (myInstance instanceof SomeType2) {
         ...
       }
       ...
    }