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

如何使用Jersey在SSE事件中发送POJO?

解决Jersey SSE发送POJO的问题

我明白你遇到的问题了——用Jersey SSE发送字符串没问题,但发送自定义POJO就失效了。这其实是因为Jersey默认没有配置POJO到JSON的序列化支持,咱们一步步来解决:

1. 添加必要依赖

首先得确保项目里引入了Jersey的Jackson JSON支持包,它会帮我们完成POJO到JSON的序列化工作。如果用Maven,在pom.xml里添加:

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>你的Jersey版本号</version>
</dependency>

注意版本要和你使用的Jersey核心版本保持一致,避免版本冲突。

2. 注册JacksonFeature到Jersey应用

在你的Jersey配置类(继承ResourceConfig的类)里,注册JacksonFeature,告诉Jersey启用JSON序列化支持:

import org.glassfish.jersey.jackson.JacksonFeature;
import org.glassfish.jersey.server.ResourceConfig;

public class MyJerseyConfig extends ResourceConfig {
    public MyJerseyConfig() {
        // 注册你的SSE资源类
        register(MySseResource.class);
        // 启用Jackson JSON序列化支持
        register(JacksonFeature.class);
    }
}

3. 修改SSE发送代码

现在你可以直接把POJO传给eventBuilder.data()了,记得指定POJO的类型(而不是String.class):

先定义你的POJO示例类:

public class MessageDTO {
    private String content;
    private int id;

    // 必须要有默认无参构造函数(Jackson序列化需要)
    public MessageDTO() {}

    public MessageDTO(String content, int id) {
        this.content = content;
        this.id = id;
    }

    // 生成getter和setter方法
    public String getContent() { return content; }
    public void setContent(String content) { this.content = content; }
    public int getId() { return id; }
    public void setId(int id) { this.id = id; }
}

然后修改发送代码:

// 假设你已经获取了EventOutput实例
final OutboundEvent.Builder eventBuilder = new OutboundEvent.Builder();
eventBuilder.name("message-to-client");
// 直接传入POJO,指定类型为你的POJO类
eventBuilder.data(MessageDTO.class, new MessageDTO("Hello world " + i + "!", i));
final OutboundEvent event = eventBuilder.build();
eventOutput.write(event);

4. 关键注意事项

  • POJO必须有默认无参构造函数,否则Jackson无法实例化对象进行反序列化。
  • 如果不想写getter/setter,可以用Jackson的@JsonAutoDetect注解让Jackson直接访问字段:
    import com.fasterxml.jackson.annotation.JsonAutoDetect;
    import com.fasterxml.jackson.annotation.PropertyAccessor;
    
    @JsonAutoDetect(fieldVisibility = PropertyAccessor.FIELD)
    public class MessageDTO {
        private String content;
        private int id;
    
        public MessageDTO(String content, int id) {
            this.content = content;
            this.id = id;
        }
    }
    
  • 确保Jersey版本和Jackson依赖版本兼容,避免出现奇怪的序列化错误。

这样修改后,你的Jersey SSE就能正常发送和接收POJO了!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:15:42