为什么 DefaultJackson2JavaTypeMapper.toJavaType() 不支持抽象 类 和接口作为推断类型?

Why doesn't DefaultJackson2JavaTypeMapper.toJavaType() support abstract classes and interfaces as inferred types?

我想使用 spring-amqp (1.7.4) 通过 RabbitMQ 从一个 Java 应用程序向另一个应用程序发送 JSON 格式的消息。这两个应用程序不共享相同的域模型 类.

我在接收端有一个通用的 @RabbitListener 注释方法,它接受一个 Event 类型的参数,一个接口。

我已经正确配置 Jackson 来处理双方的事件类型层次结构,但是,spring-rabbit 不会将我的 JSON 消息转换为正确的类型,因为 DefaultJackson2JavaTypeMapper不支持推断抽象 类 或接口。

如果我定义一个扩展 DefaultJackson2JavaTypeMapper 的自定义 JavaTypeMapper 并执行以下操作,它工作得很好:

@Override
public JavaType toJavaType(MessageProperties properties) {
    boolean hasInferredTypeHeader = hasInferredTypeHeader(properties);

    if (hasInferredTypeHeader && getTypePrecedence().equals(TypePrecedence.INFERRED)) {
        // do not check for abstract classes and interfaces here
        JavaType targetType = fromInferredTypeHeader(properties);

        return targetType;
    }

    return super.toJavaType(properties);
}

让用户负责如何进行转换(使用 spring-rabbit 约定或直接使用 Jackson)不是更好吗?也许添加一个启用抽象 类 和接口支持的标志?有什么我想念的吗?

随意打开一个Improvement JIRA Issue

Contributions are welcome 以及合适的测试用例。