是否有可能通过 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,我在其他
中找到了这个
- JAX-RS polymorphic POST request: how should I write my JSON?
- Polymorphism in JSON, Jersey and Jackson
但这些问题似乎与我无关,单独使用 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
我希望端点在单个 动词和路径 上接受一个 json 有效负载,该负载略有不同并且可以映射到不同的对象.变化通常在字段值上,例如 OAuth 世界中的 grant_type
。
我在上面废弃了 Whosebug 和 google,我在其他
中找到了这个- JAX-RS polymorphic POST request: how should I write my JSON?
- Polymorphism in JSON, Jersey and Jackson
但这些问题似乎与我无关,单独使用 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