jackson-jakarta-rs-json-provider中@JsonInclude(NON_EMPTY)失效且空列表报错
问题分析与解决方案
问题核心原因
- 原始类型空列表触发序列化失败:你返回的
Collections.EMPTY_LIST是无泛型的原始类型空集合,在Jakarta EE环境下,Jersey的消息体处理器无法识别其泛型信息,找不到对应的JSON序列化器(MessageBodyWriter),因此抛出错误。旧javax环境存在兼容处理,所以之前能正常运行。 - @JsonInclude注解作用范围不匹配:
@JsonInclude(JsonInclude.Include.NON_EMPTY)是用来控制实体类属性序列化时是否忽略空/空值集合,而当前场景是接口直接返回空集合,该注解对顶层集合的序列化逻辑不生效。
具体解决步骤
1. 替换原始空列表为泛型安全的空集合
修改DAO方法,把Collections.EMPTY_LIST替换为泛型化的空列表(Java 7+支持自动类型推断):
// 注意:原方法返回值定义有误,应改为List<TabInfoFilter>而非TabInfoFilter public List<TabInfoFilter> getFilters() { final List<TabInfoFilter> results = query.getResultList(); if (CollectionUtils.isEmpty(results)) { return Collections.emptyList(); // 泛型安全的空列表,携带类型信息 } return results; }
2. 确保Jackson Jakarta Provider配置正确
确认项目已引入jackson-jakarta-rs-json-provider(2.18.0版本),且Jersey已注册Jackson的JSON处理器:
- 代码注册方式:
register(JacksonJsonProvider.class);
- web.xml配置方式:
<init-param> <param-name>jersey.config.server.provider.classnames</param-name> <param-value>com.fasterxml.jackson.jakarta.rs.json.JacksonJsonProvider</param-value> </init-param>
3. 可选:自定义空集合响应逻辑
如果希望空集合时返回204 No Content而非[],可以修改REST接口的返回逻辑:
@GET @Path("/formular/{formularId}") @Produces(MediaType.APPLICATION_JSON) public Response getFilters(@PathParam("formularId") final int formularId) { Collection<TabInfoFilter> filters = getTabInfoFilterDAO().getFilters(mandant, userId, userId, formularId); if (filters.isEmpty()) { return Response.noContent().build(); } return Response.ok(filters).build(); }
内容的提问来源于stack exchange,提问作者SushiKute Gaming
相关产品推荐
相关产品推荐

