野蝇 |不考虑杰克逊多态性
WIldfly | Jackson polymorphism not considered
我正在 Wildfly 23.0.2.Final
中开发 REST 服务。我有一个包含 EJB 和 WAR 模块的 EAR。 WAR 模块是 JAX-RS 服务。我的大部分实体都利用了多态性,例如:
public class EchoResponse extends AjaxBody<Boolean> {
private static final long serialVersionUID = 4762378876367068194L;
/**
*
*/
public EchoResponse() {
super();
}
/**
* @param result
*/
public EchoResponse(Boolean result) {
super(result);
}
}
延伸
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "__type")
@JsonSubTypes({
@Type(value = EchoResponse.class, name = "EchoResponse"),
...
})
public class AjaxBody<T> implements Serializable {
private static final long serialVersionUID = 3528022080494570805L;
private T result;
public T getResult() {
return result;
}
public void setResult(T result) {
this.result = result;
}
public AjaxBody() {
}
public AjaxBody(T result) {
this.setResult(result);
}
}
然而,根本没有考虑多态性,在响应中我没有收到 __type
属性,导致客户端模块(一个 Java Web 应用程序建立在 Spring 和部署在一个简单的 Tomcat 实例中)以在尝试解组响应时出错(服务和客户端共享定义实体的相同 Java 模块)。
我还注意到所有注释都被忽略了,例如 @JsonIgnore
。
我已经检查了我的 Jackson 依赖项,并确认它们都在 provided
范围内。另外,我尝试按如下方式添加 jboss-deployment-structure.xml
:
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
<ear-subdeployments-isolated>true</ear-subdeployments-isolated>
<sub-deployment name="scoofer-web.war">
<exclusions>
<module name="org.jboss.resteasy.resteasy-jackson-provider" />
</exclusions>
<dependencies>
<module name="org.jboss.resteasy.resteasy-jackson2-provider" services="import" />
</dependencies>
</sub-deployment>
</jboss-deployment-structure>
请注意:所有端点都支持 application/json
和 application/xml
:如果通过 XML 调用,属性 __type
出现在 body
节点,符合预期。
我还想念什么?
我已提交 RESTEASY-2948,因为没有正确记录。要解决此问题,您需要设置 resteasy-prefer-jackson-over-jsonb
属性。最简单的方法是使用 CLI 更改子系统中的值:
/subsystem=jaxrs:write-attribute(name=resteasy-prefer-jackson-over-jsonb, value=true)
这也不应该要求您包含 jboss-deployment-structure.xml
。不过需要注意的一件事是,这确实会影响所有部署。
我正在 Wildfly 23.0.2.Final
中开发 REST 服务。我有一个包含 EJB 和 WAR 模块的 EAR。 WAR 模块是 JAX-RS 服务。我的大部分实体都利用了多态性,例如:
public class EchoResponse extends AjaxBody<Boolean> {
private static final long serialVersionUID = 4762378876367068194L;
/**
*
*/
public EchoResponse() {
super();
}
/**
* @param result
*/
public EchoResponse(Boolean result) {
super(result);
}
}
延伸
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "__type")
@JsonSubTypes({
@Type(value = EchoResponse.class, name = "EchoResponse"),
...
})
public class AjaxBody<T> implements Serializable {
private static final long serialVersionUID = 3528022080494570805L;
private T result;
public T getResult() {
return result;
}
public void setResult(T result) {
this.result = result;
}
public AjaxBody() {
}
public AjaxBody(T result) {
this.setResult(result);
}
}
然而,根本没有考虑多态性,在响应中我没有收到 __type
属性,导致客户端模块(一个 Java Web 应用程序建立在 Spring 和部署在一个简单的 Tomcat 实例中)以在尝试解组响应时出错(服务和客户端共享定义实体的相同 Java 模块)。
我还注意到所有注释都被忽略了,例如 @JsonIgnore
。
我已经检查了我的 Jackson 依赖项,并确认它们都在 provided
范围内。另外,我尝试按如下方式添加 jboss-deployment-structure.xml
:
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
<ear-subdeployments-isolated>true</ear-subdeployments-isolated>
<sub-deployment name="scoofer-web.war">
<exclusions>
<module name="org.jboss.resteasy.resteasy-jackson-provider" />
</exclusions>
<dependencies>
<module name="org.jboss.resteasy.resteasy-jackson2-provider" services="import" />
</dependencies>
</sub-deployment>
</jboss-deployment-structure>
请注意:所有端点都支持 application/json
和 application/xml
:如果通过 XML 调用,属性 __type
出现在 body
节点,符合预期。
我还想念什么?
我已提交 RESTEASY-2948,因为没有正确记录。要解决此问题,您需要设置 resteasy-prefer-jackson-over-jsonb
属性。最简单的方法是使用 CLI 更改子系统中的值:
/subsystem=jaxrs:write-attribute(name=resteasy-prefer-jackson-over-jsonb, value=true)
这也不应该要求您包含 jboss-deployment-structure.xml
。不过需要注意的一件事是,这确实会影响所有部署。