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

Jersey1.x升级到2.x后Jackson嵌套列表被扁平化的问题求助

解决Jersey 2.x中List<List>序列化扁平化的问题

我之前升级Jersey版本时也遇到过一模一样的问题,这本质是Jersey 1.x和2.x默认使用的JSON序列化组件不同导致的:

  • Jersey 1.x默认依赖Jackson来处理JSON序列化,它对嵌套集合List<List<String>>的处理是正常的二维数组格式
  • Jersey 2.x默认使用MOXy(EclipseLink JSON绑定),MOXy会把内部的List<String>默认序列化为空格分隔的字符串,而非数组

下面给你两种可行的解决方案,按需选择:

方案一:切换回Jackson作为JSON提供器(推荐)

这个方案能让序列化行为和Jersey 1.x保持一致,改动小且不易出其他兼容问题:

  1. 移除MOXy依赖(如果你的项目中已经引入):
    如果是Maven项目,找到pom.xml里的jersey-media-moxy依赖并删除。
  2. 添加Jackson的Jersey依赖:
    在pom.xml中加入:
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>你的Jersey 2.x版本号</version>
    </dependency>
    
  3. 注册JacksonFeature到Jersey应用:
    • 如果是用ResourceConfig配置应用:
      public class MyRestApplication extends ResourceConfig {
          public MyRestApplication() {
              // 注册Jackson特性
              register(org.glassfish.jersey.jackson.JacksonFeature.class);
              // 注册你的REST资源类
              register(YourResource.class);
          }
      }
      
    • 如果是用web.xml配置:
      <servlet>
          <servlet-name>Jersey Web Application</servlet-name>
          <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
          <init-param>
              <param-name>jersey.config.server.provider.classnames</param-name>
              <param-value>org.glassfish.jersey.jackson.JacksonFeature</param-value>
          </init-param>
      </servlet>
      

方案二:配置MOXy正确处理嵌套集合

如果你想继续使用MOXy作为序列化器,可以通过添加自定义适配器来修正嵌套集合的序列化行为:

  1. 创建XML适配器类:
    import javax.xml.bind.annotation.adapters.XmlAdapter;
    import java.util.List;
    
    public class NestedListAdapter extends XmlAdapter<List<String>, List<String>> {
        @Override
        public List<String> unmarshal(List<String> v) throws Exception {
            return v;
        }
    
        @Override
        public List<String> marshal(List<String> v) throws Exception {
            return v;
        }
    }
    
  2. 在实体类的字段上添加注解:
    在你的List<List<String>>类型字段上标注@XmlJavaTypeAdapter,指定上面的适配器:
    import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
    import java.util.List;
    
    public class YourResponseEntity {
        @XmlJavaTypeAdapter(NestedListAdapter.class)
        private List<List<String>> values;
    
        // 省略getter和setter方法
    }
    
    这个适配器会告诉MOXy把内部的List<String>序列化为数组,而非空格分隔的字符串。

完成上述任一方案后,你的接口返回的values字段就会恢复成Jersey 1.x时的二维数组格式了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:54:18