野蝇 |不考虑杰克逊多态性

问题描述

我正在 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/jsonapplication/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。但需要注意的一件事是,这确实会影响所有部署。