【问题标题】:WIldfly | Jackson polymorphism not considered野蝇 |不考虑杰克逊多态性
【发布时间】: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/jsonapplication/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


【解决方案1】:

我已提交RESTEASY-2948,因为这没有正确记录。要解决此问题,您需要设置 resteasy-prefer-jackson-over-jsonb 属性。最简单的方法是使用 CLI 更改子系统中的值:

/subsystem=jaxrs:write-attribute(name=resteasy-prefer-jackson-over-jsonb, value=true)

这也不要求您包含jboss-deployment-structure.xml。不过需要注意的一点是,这确实会影响所有部署。

【讨论】:

    猜你喜欢
    • 2017-05-27
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    相关资源
    最近更新 更多