You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Service Bus队列Java接收消息报错:缺失javax.ws.rs依赖

Hey Rudra,我来帮你搞定这个问题!

你遇到的java.lang.NoClassDefFoundError: javax/ws/rs/WebApplicationException本质是依赖缺失——你用的旧版Azure Service Bus SDK(com.microsoft.windowsazure开头的包)依赖JAX-RS API,但你的项目里没包含这个组件的jar包。下面分两种方式帮你解决,同时给你推荐更适合新手的新版SDK方案:

一、快速修复当前依赖问题

如果你用Maven管理项目

直接在pom.xml里添加JAX-RS API的依赖,同时确认已经引入旧版Service Bus SDK:

<!-- JAX-RS API依赖,解决缺失类的问题 -->
<dependency>
    <groupId>javax.ws.rs</groupId>
    <artifactId>javax.ws.rs-api</artifactId>
    <version>2.1.1</version>
</dependency>

<!-- 旧版Azure Service Bus SDK -->
<dependency>
    <groupId>com.microsoft.azure</groupId>
    <artifactId>azure-servicebus</artifactId>
    <version>2.2.10</version>
</dependency>

如果是手动导入jar包

  1. 下载javax.ws.rs-api-2.1.1.jar
  2. 把这个jar包添加到你的项目类路径里
二、更推荐:切换到新版Azure Service Bus SDK

你现在用的旧SDK微软已经停止维护了,对Java新手来说,新版azure-messaging-servicebus SDK更简单、文档更全,还能避免很多依赖坑。给你写个完整的接收消息示例:

第一步:添加Maven依赖

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-messaging-servicebus</artifactId>
    <version>7.17.0</version>
</dependency>

第二步:接收消息的代码

import com.azure.messaging.servicebus.*;

public class ServiceBusQueueReceiver {
    public static void main(String[] args) {
        // 从Azure门户复制你的Service Bus连接字符串
        String connectionString = "Endpoint=sb://SampleNamespace.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=t+U5ERMAnIyxgEUDUouGOKn6ADM/CuLWzEJZtauwVsc=";
        String queueName = "SampleQueue"; // 注意这里要和你创建的队列名一致

        // 用try-with-resources自动管理客户端资源
        try (ServiceBusClient client = new ServiceBusClientBuilder()
                .connectionString(connectionString)
                .buildClient()) {

            // 创建异步接收者
            ServiceBusReceiverAsyncClient receiver = client.createReceiverAsync(queueName);

            // 订阅接收消息
            receiver.receiveMessages()
                .subscribe(
                    message -> {
                        System.out.println("消息ID: " + message.getMessageId());
                        System.out.println("消息内容: " + new String(message.getBody()));
                        // 如果是PEEK_LOCK模式,需要手动调用complete确认消息处理完成;RECEIVE_AND_DELETE模式则不需要
                        receiver.complete(message);
                    },
                    error -> System.err.println("接收出错: " + error.getMessage())
                );

            // 让程序保持运行1分钟,等待接收消息
            try {
                Thread.sleep(60000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

新版SDK的好处:

  • 异步API设计,性能更好
  • 依赖更简洁,不会出现奇怪的缺失类问题
  • 微软持续维护,官方示例和文档更新及时
三、旧代码的小提醒

如果你非要用旧SDK,除了补依赖,还要检查:

  • 你的queueName变量写的是QueueName,但你创建的队列是SampleQueue,这里可能是拼写错误,会导致找不到队列
  • 旧SDK的receiveQueueMessage是同步阻塞的,循环调用在高并发场景下性能很差

作为Java新手,真心建议你用新版SDK,能少走很多弯路!

内容的提问来源于stack exchange,提问作者Rudra Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:27:18