【发布时间】:2021-09-05 06:45:00
【问题描述】:
我正在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 属性,导致客户端模块(基于 Spring 构建并部署在简单 Tomcat 实例中的 Java Web 应用程序)在尝试时出错解组响应(服务和客户端共享定义实体的同一个 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 节点中,正如预期的那样。
我还缺少什么?
【问题讨论】:
-
你可以尝试在 WildFly CLI
/subsystem=jaxrs:write-attribute(name=resteasy-prefer-jackson-over-jsonb, value=true)上执行这个。 -
@JamesR.Perkins 我先做了一个读取属性并返回给我一个
false,所以我尝试按照您的建议将其设置为true。重新启动服务器后,我收到正确的消息,谢谢!如果您希望将其发布为完整的答案,我将很高兴批准它:)
标签: java jackson jax-rs wildfly resteasy