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

时间:2018-11-30 16:08:32

标签: java jersey

我正在使用Java 8开发RESTful服务。我的资源类中具有以下方法,该方法可响应POST请求。

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

通常,如果可以直接映射json请求,则可以轻松地对该序列进行反序列化。但是,在这种情况下,SomeType是一个复杂的对象,其中包含持久存储在数据库中的其他对象。

是否可以捕获请求,弄清类型,构建对象SomeType并将其传递给store方法?我倾向于某种类型的中间件,但是我不确定该依赖项如何工作。

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

1 个答案:

答案 0 :(得分:1)

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

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

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