如何使用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
相关产品推荐
相关产品推荐

