Jax-RS Restful POST 动态 JSON

Jax-RS Restful POST with dynamic JSON

我有 REST 服务。该服务的端点之一是 POST,看起来像 'path/pathParam/{pathParamVal}'。假设 {pathParamVal} 可以在 1 到 6 之间。通常,我所要做的就是指定如何在 @POST 请求的调用函数参数上封送 JSON,例如:

@POST
@Path("/path/pathParam/{pathParamVal}")
public void processPost(List<SomeJsonObject> someJsonObject) {
}

并且假设 SomeJsonObject 定义正确。但是,我的问题是传递的 JSON 会根据 {pathParamVal} 的值发生变化。具体来说,当 {pathParamVal} 为 1、3、4、5 或 6 时,JSON 结构始终相同。但是,当 {pathParamVal} 为 2 时,它会发生变化。同样,由于 JSON 更改时, JSON 的 class 定义也会更改。类似于:

@POST
@Path("/path/pathParam/{pathParamVal}") // == 1,3,4,5,6
public void processPost(List<SomeJsonObject> someJsonObject) {
}

@POST
@Path("/path/pathParam/{pathParamVal}") // == 2
public void processPost(List<SomeOtherJsonObject> someOtherJsonObject) {
}

正是我想要的。我知道一个事实,即 JSON 将被映射到的仅有的两个列表,并且它有 .0001% 的机会永远改变。那么我想要实现的目标是可能的吗?我尝试使用泛型和通配符,但我对它们不太熟悉,所以我可能没有正确实现它们。

如果迫在眉睫而这是不可能的,我想我总是可以将 SomeJsonObjectSomeOtherJsonObject 的 class 定义组合成类似 CombinedJsonObject,然后接受List<CombinedJsonObject> combinedJsonObject作为参数,但我提出这个问题的主要原因是为了避免走那条路。

在我看来,这是一个令人困惑的问题API。我认为也许应该使用其他类型的文字而不是数字。我的意思是 URI 中的 pathParam/{pathParamValue} 应该被像 pathParamMeaning 这样的文字更改,但是,无论如何,如果您将 url 模式更改为数字“2”,它将仅匹配这些要求。

@POST
@Path("/path/pathParam/{pathParamVal}") // == 2
public void processPost(List<SomeOtherJsonObject> someOtherJsonObject) {
}

应替换为

@POST
@Path("/path/pathParam/2") // == 2
public void processPost(List<SomeOtherJsonObject> someOtherJsonObject) {
}

您甚至可以进一步使用正则表达式模式。这可能是第一种情况的匹配模式:除了 "2":

@Path("path/pathParam/{pathParamVal : [0-1,3-9]}")