为什么 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 以及合适的测试用例。
我想使用 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 以及合适的测试用例。