为了账号安全,请及时绑定邮箱和手机立即绑定

用于rabbitmq的Spring Boot可信包

用于rabbitmq的Spring Boot可信包

临摹微笑 2021-06-29 12:50:29
我们正在构建一个通过 RabbitMQ 接收消息的 Spring Boot 应用程序 (2.0.4-RELEASE)。因此application.properties包含兔子相关的配置:spring.rabbitmq.addresses=****spring.rabbitmq.username=****spring.rabbitmq.password=****spring.rabbitmq.listener.simple.concurrency=2spring.rabbitmq.listener.simple.prefetch=5spring.rabbitmq.listener.simple.retry.enabled=truespring.rabbitmq.listener.simple.retry.max-attempts=5配置:@Beanpublic TopicExchange fileUpdate() {    return new TopicExchange("my.fancy.exchange", true, false);}@Beanpublic Queue fileUpload() {    return new Queue("myFancyQueue", true);}@Beanpublic Binding bindingUpload(Queue queue, TopicExchange eventExchange) {    return BindingBuilder.bind(queue).to(eventExchange).with("");}消息消费者:@RabbitListener(queues = "myFancyQueue")public void receive(Object message) {    ...}当收到特定类型的消息(例如__TypeId__: my.fancy.package.Clazz)时,抛出以下错误:引起:java.lang.IllegalArgumentException:类“my.fancy.package.Clazz”不在受信任的包中:[java.util, java.lang]。如果您认为这个类可以安全地反序列化,请提供它的名称。如果序列化仅由受信任的来源完成,您还可以启用全部信任 (*)。从我迄今发现的ActiveMQ通过提供一个配置选项application.properties作为spring.activemq.packages.trust-all=或者spring.activemq.packages.trusted=但我找不到任何适用于 rabbitMQ 的类似选项。到目前为止,我一直在使用一种解决方法来解决我的问题,但当然,在配置文件中有这样的选项会很棒。
查看完整描述

1 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

我通过在正在使用的 Spring AMQP ClassMapper 上设置受信任的包来修复相同的错误。


@Configuration

public class RabbitConfig {


    @Bean

    @Scope("prototype")

    public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(SimpleRabbitListenerContainerFactory factory, ObjectMapper objectMapper) {

        factory.setMessageConverter(jsonToMapMessageConverter(objectMapper));

        return factory;

    }


    @Bean

    public MessageConverter jsonToMapMessageConverter(ObjectMapper objectMapper) {

        Jackson2JsonMessageConverter messageConverter = new ImplicitJsonMessageConverter(objectMapper);

        DefaultClassMapper classMapper = new DefaultClassMapper();

        classMapper.setTrustedPackages("*");

        classMapper.setDefaultType(Map.class);

        messageConverter.setClassMapper(classMapper);

        return messageConverter;

    }


    public static class ImplicitJsonMessageConverter extends Jackson2JsonMessageConverter {    

        public ImplicitJsonMessageConverter(ObjectMapper jsonObjectMapper) {

            super(jsonObjectMapper, "*");

        }    

        @Override

        public Object fromMessage(Message message) throws MessageConversionException {

            message.getMessageProperties().setContentType("application/json");

            return super.fromMessage(message);

        }

    }

}


查看完整回答
反对 回复 2021-07-07
  • 1 回答
  • 0 关注
  • 126 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信