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

时间:2017-10-04 15:27:58

标签: java json spring spring-amqp

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

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

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

如果我定义了一个扩展JavaTypeMapper并执行以下操作的自定义DefaultJackson2JavaTypeMapper,那么它的效果非常好:

@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)?也许添加一个启用抽象类和接口支持的标志?我有什么遗失的吗?

1 个答案:

答案 0 :(得分:0)

随意打开Improvement JIRA Issue

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