是否有可能通过 Jersey 在 POST 资源上实现 json 有效负载的多态反序列化

Is it possible to possible to achieve with Jersey a polymorphic deserialisation of json payloads on POST resources

我希望端点在单个 动词和路径 上接受一个 json 有效负载,该负载略有不同并且可以映射到不同的对象.变化通常在字段值上,例如 OAuth 世界中的 grant_type

我在上面废弃了 Whosebug 和 google,我在其他

中找到了这个

但这些问题似乎与我无关,单独使用 jackson 反序列化就可以很好地处理此有效负载,但 Jersey 总是拒绝初始化 servlet,并出现错误,让我认为没有办法解决它。

@Path("parent")
interface Resource {
    @POST
    @Path("test")
    String test(Payload1 payload1);

    @POST
    @Path("test")
    String test(Payload2 payload1);

    @Data
    @JsonTypeName("payload1")
    class Payload1 extends BasePayload {
        String a;
    }

    @Data
    @JsonTypeName("payload2")
    class Payload2 extends BasePayload {
        String b;
    }

//    @JsonTypeInfo(use= Id.MINIMAL_CLASS, include=As.PROPERTY, property="@class")
    @JsonTypeInfo(use= Id.NAME, include=As.PROPERTY, property="@payload")
    @JsonSubTypes({
                      @JsonSubTypes.Type(value = Payload1.class),
                      @JsonSubTypes.Type(value = Payload2.class)
    })
    class BasePayload {
    }

但是我在 servlet 初始化时在异常中收到此消息。 (为清楚起见编辑了消息)

</pre><p><b>root cause</b></p><pre>
org.glassfish.jersey.server.model.ModelValidationException: 
  Validation of the application resource model has failed during application initialization.

[[FATAL] A resource model has 
ambiguous (sub-)resource method for HTTP method POST and input mime-types as defined by
 "@Consumes" and "@Produces" annotations 
at Java methods 
 public java.lang.String xxx.Service.test(xxx.Resource$Payload1) 
and 
 public java.lang.String xxx.Service.test(xxx.Resource$Payload2) 
at matching regular expression /test. 

These two methods produces and consumes exactly the same mime-types and 
therefore their invocation as a resource methods will always fail.;
source='org.glassfish.jersey.server.model.RuntimeResource@59b668bf']

但是请注意,具有有效载荷的父 class 的端点是可行的,但您必须自己处理调度。

@POST
@Path("test")
String test(BasePayload payload);

我正在使用 Spring-Boot 1.4 / Jersey 2.23.2 / Jackson 2.8.5

JAX-RS 运行时使用以下方法将请求匹配到资源方法:

  • URI:定义在@Path注释中。

  • 请求方法:由资源方法指示符定义,例如@GET, @POST等)

  • 媒体类型:分别在Accept and Content-Type headers, that are matched with the values defined in the @Produces and @Consumes注解中定义。

有效负载的内容未被考虑在内,因此您的第一个方法定义不明确。

如您所知,可以采用以下方法:

@POST
@Path("test")
String test(BasePayload payload);