博观而约取,厚积而薄发。这篇文章主要讲述如果我在RabbitTemplate上直接设置它们,为什么Spring需要在Converter和ClassMapper上使用@Bean?相关的知识,希望能为你提供帮助。
我想了解为什么我需要用getMessageConverter
标记classMapper
和@Bean
方法,甚至直接在我的自定义RabbiteTemplate中设置它们。
没有@Bean
并将它们传递给private
,消息中没有正确包含TypeId
。
所以,使用@Bean和public方法,我在消息上有正确的标题:
headers: __TypeId__:OrderProducer
没有它们,消息包含不正确的TypeId:
headers: __TypeId__:com.projet.order.message.OrderProducer
没有classMapper的默认行为是什么。
【如果我在RabbitTemplate上直接设置它们,为什么Spring需要在Converter和ClassMapper上使用@Bean()】看代码:
@Bean(name = "sendCommandOrderCreate")
public RabbitTemplate sendCommandOrderCreate() {
RabbitTemplate rabbitTemplate = createRabbitTemplate(getMessageConverter());
rabbitTemplate.setExchange("order.exchange");
rabbitTemplate.setRoutingKey("order.cmd.create");
return rabbitTemplate;
}private RabbitTemplate createRabbitTemplate(final MessageConverter messageConverter) {
final RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
rabbitTemplate.setMessageConverter(messageConverter);
return rabbitTemplate;
}@Bean
public Jackson2JsonMessageConverter getMessageConverter() {
Jackson2JsonMessageConverter jackson2JsonMessageConverter = new Jackson2JsonMessageConverter();
jackson2JsonMessageConverter.setClassMapper(classMapper());
return jackson2JsonMessageConverter;
}@Bean
public DefaultClassMapper classMapper() {
DefaultClassMapper classMapper = new DefaultClassMapper();
Map<
String, Class<
?>
>
idClassMapping = new HashMap<
>
();
idClassMapping.put(OrderProducer.class.getSimpleName(), OrderProducer.class);
idClassMapping.put(OrderConsumer.class.getSimpleName(), OrderConsumer.class);
classMapper.setIdClassMapping(idClassMapping);
return classMapper;
}
我是如何在服务中注入bean的:
public OrderService(@Qualifier("sendCommandOrderCreate") RabbitTemplate rabbitTemplate) {
this.rabbitTemplate = rabbitTemplate;
}
答案我发现了这个问题。我决定使用另一个Mapper:
DefaultJackson2javaTypeMapper
。private DefaultJackson2JavaTypeMapper classMapper() {
DefaultJackson2JavaTypeMapper classMapper = new DefaultJackson2JavaTypeMapper();
Map<
String, Class<
?>
>
idClassMapping = new HashMap<
>
();
idClassMapping.put(OrderProducer.class.getSimpleName(), OrderProducer.class);
idClassMapping.put(OrderConsumer.class.getSimpleName(), OrderConsumer.class);
classMapper.setIdClassMapping(idClassMapping);
return classMapper;
}
调试代码并查找ClassMapper的不同实现后,我可以找到这个映射器。
DefaultClassMapper
无法提供我期待的行为,我无法解释为什么用@Bean
声明它可能会改变他的行为(可能是Spring上的一个bug)。推荐阅读
- 用户'IIS APPPOOLASP.NET v4.0'登录失败
- 将Cocoapods与App Extension一起使用
- 应用程序名称在模拟器中具有.app作为后缀
- 如何启动App Store应用程序并导航到开发人员页面
- 你能获得Apple Watch的大概电池百分比吗()
- djangocms与apphook对象集成filer_image
- Apple标签,Apple脚本和Evernote
- 在Android的特殊时间结束视频Youtube
- android - Youtube api 400 Bad Request