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

Apache Pulsar与Spring Boot自定义对象收发报错求助

Spring Boot集成Apache Pulsar自定义对象收发问题解决

第一个错误:IllegalAccessException(JDK模块权限限制)

这个报错是因为Pulsar客户端的DnsResolverUtil类尝试访问JDK内部的sun.net.InetAddressCachePolicy,而JDK 9+的模块化系统默认禁止外部代码访问内部API。解决方法二选一:

  • 给JVM添加启动参数:--add-exports java.base/sun.net=ALL-UNNAMED
  • 升级Apache Pulsar客户端到2.10.0及以上版本(该版本已移除对这个内部类的依赖)

第二个错误:NullPointerException(Schema为空指针)

你的代码有两处问题导致这个报错:

  1. PulsarTemplate的Schema不该在ApplicationRunner里临时设置,应该在Bean定义阶段指定,确保全局生效
  2. @PulsarListener用schemaType = SchemaType.AUTO_CONSUME无法自动匹配自定义对象的JSON Schema,需要显式指定类型

修正后的完整代码

@SpringBootApplication
public class QuickbooksApplication {

    public static void main(String[] args) {
        SpringApplication.run(QuickbooksApplication.class, args);
    }

    @Data
    @Builder
    @ToString
    @NoArgsConstructor
    @AllArgsConstructor
    public static class SomeClass {
        private String someVariable;
    }

    // 定义绑定JSON Schema的PulsarTemplate Bean
    @Bean
    public PulsarTemplate<SomeClass> pulsarTemplate(PulsarClient pulsarClient) {
        return new PulsarTemplate<>(pulsarClient, JSONSchema.of(SomeClass.class));
    }

    @Bean
    ApplicationRunner runner(PulsarTemplate<SomeClass> pulsarTemplate) {
        SomeClass someClass = SomeClass.builder().someVariable("Hello World!!!").build();
        return (args) -> pulsarTemplate.send("hello-pulsar", someClass);
    }

    // 显式指定Schema类型为JSON,让监听器正确解析自定义对象
    @PulsarListener(
        subscriptionName = "hello-pulsar-subscription",
        topics = "hello-pulsar",
        schemaType = SchemaType.JSON
    )
    void listen(SomeClass message) {
        System.out.println("Message Received: " + message);
    }
}

另一种简化方案:用注解标记自定义类

在自定义类上添加@Schema注解,让Spring Pulsar自动识别Schema类型,这样不用在Bean和监听器里额外配置:

@Data
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Schema(schemaType = SchemaType.JSON)
public static class SomeClass {
    private String someVariable;
}

此时PulsarTemplate可以直接注入使用,@PulsarListener也无需指定schemaType。

额外注意事项

  • 确保Spring Pulsar依赖版本与Pulsar服务端版本兼容
  • 确认Pulsar服务地址配置正确,服务正常运行
  • 自定义类必须保留无参构造方法(你的代码已经通过@NoArgsConstructor实现,符合要求)

内容的提问来源于stack exchange,提问作者Keshavram Kuduwa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 21:45:29