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保持一致,改动小且不易出其他兼容问题:
- 移除MOXy依赖(如果你的项目中已经引入):
如果是Maven项目,找到pom.xml里的jersey-media-moxy依赖并删除。 - 添加Jackson的Jersey依赖:
在pom.xml中加入:<dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-jackson</artifactId> <version>你的Jersey 2.x版本号</version> </dependency> - 注册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作为序列化器,可以通过添加自定义适配器来修正嵌套集合的序列化行为:
- 创建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; } } - 在实体类的字段上添加注解:
在你的List<List<String>>类型字段上标注@XmlJavaTypeAdapter,指定上面的适配器:
这个适配器会告诉MOXy把内部的import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import java.util.List; public class YourResponseEntity { @XmlJavaTypeAdapter(NestedListAdapter.class) private List<List<String>> values; // 省略getter和setter方法 }List<String>序列化为数组,而非空格分隔的字符串。
完成上述任一方案后,你的接口返回的values字段就会恢复成Jersey 1.x时的二维数组格式了。
内容的提问来源于stack exchange,提问作者BlueJay
相关产品推荐
相关产品推荐

