将复杂对象注入 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 功能来解决。
- 一般方法是为每个需要支持的传入类型创建一个 class。前任。 SomeType1、SomeType2、SomeType3`。
- 所有这些 class 都应该扩展 SomeType 父 class。
SomeType
父级 class 应该有一个 CustomDeserializer。
- 在 CustomDeserializer 中,您可以检查 json 字段以确定应将 json 反序列化为哪种类型。
- 然后可以使用JsonParser.readValueAs方法将json反序列化为想要的类型SomeType1,SomeType2, 或 SomeType3.
如果您需要从数据库中获取更多数据并填充 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) {
...
}
...
}
我正在 Java 8 中开发 RESTful 服务。我的资源 class 中有以下方法,它响应 POST
请求。
@POST
public Response store(SomeType myInstance){ ... }
通常,如果可以直接映射 json
请求,则此 get 会顺利反序列化。但是,在这种情况下,SomeType
是一个复杂的对象,其中包含保存在数据库中的其他对象。
有没有办法捕获请求、确定类型、构建对象 SomeType
然后将其传递给 store
方法?我倾向于某种类型的中间件,但我不太确定依赖项将如何工作。
注意:出于安全原因,我可以使用的第 3 方包非常有限。所以我不能使用开箱即用的解决方案。
我认为您的用例可以通过 Jackson 的 CustomDeserializer 功能来解决。
- 一般方法是为每个需要支持的传入类型创建一个 class。前任。 SomeType1、SomeType2、SomeType3`。
- 所有这些 class 都应该扩展 SomeType 父 class。
SomeType
父级 class 应该有一个 CustomDeserializer。- 在 CustomDeserializer 中,您可以检查 json 字段以确定应将 json 反序列化为哪种类型。
- 然后可以使用JsonParser.readValueAs方法将json反序列化为想要的类型SomeType1,SomeType2, 或 SomeType3.
如果您需要从数据库中获取更多数据并填充 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) { ... } ... }