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

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