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

jackson-jakarta-rs-json-provider中@JsonInclude(NON_EMPTY)失效且空列表报错

问题分析与解决方案

问题核心原因

  1. 原始类型空列表触发序列化失败:你返回的Collections.EMPTY_LIST是无泛型的原始类型空集合,在Jakarta EE环境下,Jersey的消息体处理器无法识别其泛型信息,找不到对应的JSON序列化器(MessageBodyWriter),因此抛出错误。旧javax环境存在兼容处理,所以之前能正常运行。
  2. @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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 11:03:18