调用RabbitMQ API出现401未授权错误的求助
解决RabbitMQ API调用401未授权问题
问题原因
你遇到的401错误是因为调用RabbitMQ管理API时未携带认证信息。你配置的spring.rabbitmq.username和spring.rabbitmq.password是给AMQP客户端使用的,和RestTemplate调用REST API无关,所以请求被服务端拒绝。另外你的application.properties里存在配置错误:spring.rabbitmq.addresses是用来指定AMQP服务地址的,不是API地址,应该改成localhost:5672或者直接删除(因为已经单独配置了host和port)。
修复步骤
1. 修正application.properties
spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest # 移除错误的API地址配置,或改为正确的AMQP地址 # spring.rabbitmq.addresses=localhost:5672 rabbitmq-api-url = http://localhost:8080/api/
2. 给RestTemplate添加Basic认证
修改你的StartupCLass,注入RabbitMQ的用户名密码,配置RestTemplate携带认证信息:
@Component public class StartupCLass implements ApplicationListener<ApplicationReadyEvent> { @Value("${rabbitmq-api-url}") private String endpoint; @Value("${spring.rabbitmq.username}") private String rabbitUser; @Value("${spring.rabbitmq.password}") private String rabbitPass; @Override public void onApplicationEvent(ApplicationReadyEvent event) { // 构建带Basic认证的RestTemplate RestTemplate restTemplate = new RestTemplateBuilder() .basicAuthentication(rabbitUser, rabbitPass) .build(); // 获取队列列表 ResponseEntity<String> queuesResponse = restTemplate.getForEntity(endpoint + "queues", String.class); // 获取交换机列表 ResponseEntity<String> exchangesResponse = restTemplate.getForEntity(endpoint + "exchanges", String.class); // 后续可将响应字符串解析为实体对象,与本地JSON文件对比 // 例如用ObjectMapper解析成List<Queue>、List<Exchange>类型 } }
针对你的实际需求
拿到队列和交换机的响应后,你可以用Jackson的ObjectMapper把JSON字符串解析成自定义的实体类(比如包含name字段的Queue、Exchange类),再读取本地修改后的JSON文件并解析为相同类型的列表,通过对比两者的名称差异,找出被重命名的资源。
内容的提问来源于stack exchange,提问作者user20598130
相关产品推荐
相关产品推荐

