用于rabbitmq的Spring Boot可信包

我们正在构建一个通过 RabbitMQ 接收消息的 Spring Boot 应用程序 (2.0.4-RELEASE)。因此application.properties包含兔子相关的配置:


spring.rabbitmq.addresses=****

spring.rabbitmq.username=****

spring.rabbitmq.password=****

spring.rabbitmq.listener.simple.concurrency=2

spring.rabbitmq.listener.simple.prefetch=5

spring.rabbitmq.listener.simple.retry.enabled=true

spring.rabbitmq.listener.simple.retry.max-attempts=5

配置:


@Bean

public TopicExchange fileUpdate() {

    return new TopicExchange("my.fancy.exchange", true, false);

}


@Bean

public Queue fileUpload() {

    return new Queue("myFancyQueue", true);

}


@Bean

public 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 的类似选项。到目前为止,我一直在使用一种解决方法来解决我的问题,但当然,在配置文件中有这样的选项会很棒。


临摹微笑
浏览 127回答 1
1回答

宝慕林4294392

我通过在正在使用的 Spring AMQP ClassMapper 上设置受信任的包来修复相同的错误。@Configurationpublic 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);        }    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java