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为空指针)
你的代码有两处问题导致这个报错:
PulsarTemplate的Schema不该在ApplicationRunner里临时设置,应该在Bean定义阶段指定,确保全局生效@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
相关产品推荐
相关产品推荐

